Подтвердить что ты не робот

Получать уведомления, когда текущая вкладка снова выбрана

Я реализовал TabActivity, который реализует OnTabChangeListener. Эта активность будет уведомлена об изменениях вкладок (onTabChanged(String tabId)).

Можно ли также получать уведомление, если пользователь снова выбирает текущую вкладку?

Я хотел бы использовать это событие для выполнения "обновления" текущего содержимого вкладки вместо того, чтобы предоставлять кнопку обновления на вкладке или в меню параметров.


То, как я, наконец, решил проблему - подсказка решения была в ответе MisterSquonk.

(1) Определите OnTabReselectListener, который должен быть реализован с помощью действия, которое представляет собой содержимое вкладки и которое будет уведомлено о повторном выборе событий.

/**
 * Interface definition for a callback to be invoked when a current selected tab
 * in a TabHost is selected again.
 */
public interface OnTabReselectListener {

    /**
     * Called when a current visible tab is selected again. Will not be invoked
     * on tab changes.
     */
    void onTabReselect();

}

(2) setOnTouchListener для каждого дочернего элемента tabWidget в onCreate() из TabActivity (из ответа MisterSquonk)

for (int i = 0; i < tabWidget.getChildCount(); i++) {
    View v = tabWidget.getChildAt(i);
    v.setOnTouchListener(this);
}

(3) Внесите OnTouchListener.onTouch() в TabActivity. Выполните некоторую логику, чтобы решить, была ли выбрана текущая вкладка и не указана активность вкладок.

/**
 * @see android.view.View.OnTouchListener#onTouch(android.view.View,
 *      android.view.MotionEvent)
 */
@Override
public boolean onTouch(View v, MotionEvent event) {
    boolean consumed = false;
    // use getTabHost().getCurrentTabView to decide if the current tab is
    // touched again
    if (event.getAction() == MotionEvent.ACTION_DOWN
            && v.equals(getTabHost().getCurrentTabView())) {
        // use getTabHost().getCurrentView() to get a handle to the view
        // which is displayed in the tab - and to get this views context
        View currentView = getTabHost().getCurrentView();
        Context currentViewContext = currentView.getContext();
        if (currentViewContext instanceof OnTabReselectListener) {
            OnTabReselectListener listener = (OnTabReselectListener) currentViewContext;
            listener.onTabReselect();
            consumed = true;
        }
    }
    return consumed;
}
4b9b3361

Ответ 1

Возможно, вам удастся заставить это работать, выполнив реализацию TabActivity View.onTouchListener и вызвав setOnTouchListener для каждой из вкладок...

for (int i = 0; i < tabWidget.getChildCount(); i++) {
    View v = tabWidget.getChildAt(i);
    v.setOnTouchListener(this);
}

Затем переопределите onTouch() в вашей активности...

@Override
public boolean onTouch(View v, MotionEvent event) {

    // Not sure what to do here to identify each tab

    return false;
}

Как вы можете видеть из комментария выше, я не уверен, что делать с параметром View (v) в прослушивателе onTouch, чтобы определить, какая Tab была затронута.

Я могу подтвердить, что он срабатывает независимо от того, касаются ли вы текущую выбранную вкладку или та, которая не выбрана, и она не мешает изменению вкладок.

Надеюсь, что это поможет.

Ответ 2

Я как бы новичок в Android, но я думаю, что у меня есть более подходящее решение этой проблемы.

Прежде всего (как было сказано ранее) этот код в TabHost.java делает невозможным прослушивание второго нажатия кнопки вкладок:

public void setCurrentTab(int index) {
if (index < 0 || index >= mTabSpecs.size()) {
    return;
}

if (index == mCurrentTab) {
    return;
}
...

Итак, начните с создания собственного подкласса TabHost (com.mydomain.CustomTabHost)

@Override
public void setCurrentTab(int index) {
if (this.getCurrentTab() == index) {
        // User clicked active tab...
    }
    super.setCurrentTab(index);
}

Ваша tabActivity ищет компонент TabHost с идентификатором "tabhost". Поэтому просто измените ссылку в своем макете-xml с TabHost на новый пользовательский класс:

<com.yourdomain.CustomTabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent">

(обратите внимание на атрибут android: id)

/Tommy

Ответ 3

Нет, это невозможно. Ниже приведен код из TabHost

public void setCurrentTab(int index) {
    if (index < 0 || index >= mTabSpecs.size()) {
        return;
    }

    if (index == mCurrentTab) {
        return;
    }
    ...

У вас нет доступа к mCurrentTab, поэтому слушатель даже не вызывается.

Но если вы действительно хотите, вы можете попробовать отражение (Изменить приватное статическое конечное поле с использованием отражения Java)

Ответ 4

Я особенно работаю над 2.2 и использую ActivityGroup для группировки действий, поскольку Фрагменты представлены в API 11. Итак, я не знаю о фрагментах, но если вы работаете с ActivityGroup, это работает для меня:

Во-первых, Kudos для MisterSquonk за его "использование идеи интерфейса OnTouchListener!!"

1) Сделайте статический TabHost TabHost static TabHost tabhost. В ActivityGroup возьмите переменную класса static того же класса (ActivityGroup), что и static YourActivityGroup activitygroup;, и выполните инициализацию в onCreate с помощью this и создайте метод, который изменяет представление и активность на той же вкладке, например:

    public void replaceContentView(String activityIdOrTag,Intent activityIntent)
    {                   
      View v= getLocalActivityManager().startActivity(activityIdOrTag,activityIntent)
                    .getDecorView();
    this.setContentView(v);
 }

2) Просто реализуйте OnTouchListener для любых ваших действий, которые включены в ваш ActivityGroup, или я рекомендую реализовать его ActivityGroup.

3) Установите OnTouchListener как

YourTabActivity.tabhost.getCurrentTabView().setOnTouchListener(this)

4) Теперь в OnTouch(View v,MotionEvent e):

if (e.getAction()==MotionEvent.ACTION_DOWN)
    {
     Intent backToTop = new Intent(this, YourTopLevel.class);
     YourActivityGroup.activitygroup.replaceContentView("YourTopActivity", backToTop);
    }

Надеюсь, это поможет вам. Я новичок в андроиде. Любой вопрос будет с благодарностью.