我实施了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;
}
答案 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;
类变量,并使用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的新手。任何问题都将不胜感激。