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

Я реализовал 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;
}

4 ответа

Решение

Возможно, вам удастся заставить это работать, если ваша реализация 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, чтобы определить, какая вкладка была затронута.

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

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

Я немного новичок в 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". Так что просто измените ссылку в вашем layout-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)

/Томми

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

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

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

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

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

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

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

1) Сделай свой 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);
    }

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

Другие вопросы по тегам