再次选择当前选项卡时收到通知

时间:2011-03-30 14:34:16

标签: android

我实施了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)TabActivity的onCreate()中的每个tabWidget子项的setOnTouchListener(来自MisterSquonk的答案)

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

(3)在TabActivity中实现OnTouchListener.onTouch()。做一些逻辑来决定是否再次选择当前选项卡,而不是选项卡的活动。

/**
 * @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 个答案:

答案 0 :(得分:9)

您可以通过让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;
}

从上面的评论中可以看出,我不知道如何处理onTouch监听器中的View(v参数)以识别触摸了哪个Tab。

我可以确认无论您是否触摸当前选定的标签或未选中的标签,它都不会影响更改标签。

希望它有所帮助。

答案 1 :(得分:4)

我是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正在寻找ID为“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属性)

/托米

答案 2 :(得分:1)

不,这不是而是。以下是TabHost

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

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

您无法访问mCurrentTab,因此甚至不会调用侦听器。

但如果您真的想要,可以尝试反思(例如Change private static final field using Java reflection

答案 3 :(得分:0)

我特别致力于2.2并使用ActivityGroup进行捆绑活动,因为API 11中引入了碎片。 所以,我不知道片段,但如果你正在使用ActivityGroup,这对我有用:

首先,感谢MisterSquonk的“使用OnTouchListener界面理念!!”

1)使TabHost静态即static TabHost tabhost。在ActivityGroup中,获取与static相同的类(ActivityGroup)的static YourActivityGroup activitygroup;类变量,并使用onCreatethis中初始化,并创建一个方法更改同一选项卡中的视图和活动。喜欢:

    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的新手。任何问题都将不胜感激。