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

我实现了一个实现OnTabChangeListenerTabActivity 。 活动将在选项卡更改上通知( onTabChanged(String tabId) )。

如果用户再次select当前选项卡,是否也可以得到通知?

我想使用此事件来执行当前标签内容的“刷新”,而不是在选项卡或选项菜单中提供刷新button。


这就是我最终解决问题的方法 – 解决scheme提示是在MisterSquonk答案中。

(1)定义一个OnTabReselectListener,它必须由一个活动来实现,该活动表示一个标签内容,并将在重新select事件上通知。

 /** * 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()。 做一些逻辑来决定是否再次select当前选项卡并通知选项卡的活动。

 /** * @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; } 

Solutions Collecting From Web of "当再次select当前选项卡时会收到通知"

您可以通过使TabActivity实现View.onTouchListener并为每个选项卡调用setOnTouchListener来获得此function。

 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已被触摸。

我可以确认是否触摸当前select的选项卡或未选中的选项卡,并且不会干扰更改的选项卡。

希望能帮助到你。

我对Android很陌生,但是我想我有一个更好的解决方法来解决这个问题。

首先(如前所述)在TabHost.java中的这段代码使得不可能再次点击一个标签button:

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

所以开始创build自己的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属性)

/汤米

不,这是不可能的。 以下是来自TabHost的代码

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

您无权访问mCurrentTab,因此侦听器甚至没有被调用。

但是,如果你真的想要你可以尝试reflection(例如使用Javareflection更改私有静态最终字段 )

我特别在2.2上工作,并使用ActivityGroup捆绑活动,因为Fragments是在API 11中引入的。所以,我不知道Fragments,但是如果你正在使用ActivityGroup,这对我有用:

首先,向MisterSquonk表示他的“使用OnTouchListener接口想法!!”

1)让你的static TabHost tabhost静态,即static TabHost tabhost 。 在你的ActivityGroup ,像static YourActivityGroup activitygroup;一样使用同一个类(ActivityGroup)的static类variablesstatic YourActivityGroup activitygroup; 并使用它在onCreate进行初始化,并创build一个方法来更改同一个选项卡中的视图和活动。 喜欢:

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

2)只要将OnTouchListener实现到ActivityGroup包含的任何活动中,或者我build议您实施到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。 任何问题将不胜感激。