Android TabWidget检测点击当前标签

我试图find方法能够触发一个选项卡上的onclick事件当这个选项卡是当前选项卡。

我曾尝试过这种方式(其他几种),但没有成功。

public void onTabChanged(String tabId) { Log.d(this.getClass().getName(), ">>>>>>>>>>>>>>>>>>>>>>>> tabId: " + tabId); int tabs = getTabWidget().getChildCount(); Log.d(this.getClass().getName(), "tabs: " + tabs); for(int i=0; i<tabs; i++){ View tab = getTabWidget().getChildAt(i); if(i==tabHost.getCurrentTab()){ Log.d(this.getClass().getName(), "tab: " + i); tab.setOnClickListener(this); }else{ tab.setOnClickListener(null); tab.getOnFocusChangeListener(); } } } 

重点是,我将onClickListener设置为null ,下次我点击一个标签没有任何反应,但我想有正常的标签行为。

那里有什么想法?

经过对tab标签监听器的很多解决scheme后,我已经find了非常简单的解决scheme…

 getTabHost().setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { int i = getTabHost().getCurrentTab(); Log.i("@@@@@@@@ ANN CLICK TAB NUMBER", "------" + i); if (i == 0) { Log.i("@@@@@@@@@@ Inside onClick tab 0", "onClick tab"); } else if (i ==1) { Log.i("@@@@@@@@@@ Inside onClick tab 1", "onClick tab"); } } }); 

经过很多的思考,这个解决scheme比我想象的要容易得多。 我所做的只是创build一个新的子类,扩展TabHost并覆盖setCurrentTab方法,如下所示:

 package com.mycompany.Views; import android.content.Context; import android.util.AttributeSet; import android.widget.TabHost; import android.widget.Toast; public class ReclickableTabHost extends TabHost { public ReclickableTabHost(Context context) { super(context); } public ReclickableTabHost(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setCurrentTab(int index) { if (index == getCurrentTab()) { // FIRE OFF NEW LISTENER } else { super.setCurrentTab(index); } } } 

要使用新的类而不是典型的TabHost,只需使用以下命令编辑布局xml文件:

 <FrameLayout android:layout_height="match_parent" android:layout_width="0dip" android:layout_weight=".8"> <com.myCompany.Views.ReclickableTabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent" android:visibility="gone"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/tab_unselected_holo"/> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent"> </FrameLayout> </LinearLayout> </com.myCompany.Views.ReclickableTabHost> 

希望这可以帮助…

我想我已经find了一个解决scheme,下面是一个示例代码:

  intent = new Intent(this, HomeGroup.class); View tab1 = _inflater.inflate(R.layout.custom_tab_1,null); homeTab.setTag("Tab1"); spec = tabHost.newTabSpec("Tab1").setIndicator(tab1).setContent(intent); tabHost.addTab(spec); View tab2 = _inflater.inflate(R.layout.custom_tab_2,null); homeTab.setTag("Tab2"); spec = tabHost.newTabSpec("Tab2").setIndicator(tab2).setContent(intent); tabHost.addTab(spec); View tab3 = _inflater.inflate(R.layout.custom_tab_3,null); homeTab.setTag("Tab3"); spec = tabHost.newTabSpec("Tab3").setIndicator(tab3).setContent(intent); tabHost.addTab(spec); tabHost.setOnTabChangedListener(this); //click on seleccted tab int numberOfTabs = tabHost.getTabWidget().getChildCount(); for(int t=0; t<numberOfTabs; t++){ tabHost.getTabWidget().getChildAt(t).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_UP){ String currentSelectedTag = MainTab.this.getTabHost().getCurrentTabTag(); String currentTag = (String)v.getTag(); Log.d(this.getClass().getSimpleName(), "currentSelectedTag: " + currentSelectedTag + " currentTag: " + currentTag); if(currentSelectedTag.equalsIgnoreCase(currentTag)){ MainTab.this.getTabHost().setCurrentTabByTag(currentTag); String newSelectedTabTag = MainTab.this.getTabHost().getCurrentTabTag(); if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){ //do smthg }else if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){ //do smthg }else if(newSelectedTabTag.toLowerCase().indexOf("tab3")!=-1){ //do smthg } return true; } } return false; } }); } 

也许有可能改善它,但这对我来说是工作!

丑陋的修复:在tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab);放: tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); 其他选项卡的索引我在选项卡下使用我最简单的视图。

PS客户总是希望他们的应用程序是不同的:)

这是我使用的代码(我只有两个选项卡Tab1和Tab2):

  getTabWidget().getChildAt(1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d(TAG,"1"+getTabHost().getCurrentTabTag()); if (getTabHost().getCurrentTabTag().equals("Tab2")) { Log.d(TAG,"2"); tabHost.setCurrentTab(0); tabHost.setCurrentTab(1); } else { tabHost.setCurrentTab(1); } } }); 

这里的问题是setOnTabChangedListener在点击选定的选项卡时不会触发,如果在选项卡上设置了OnClickListener ,则会失去正常的选项卡行为。

因此,一个简单的解决scheme是在选项卡上放置OnClickListener ,并在其内部以编程方式设置这是当前选项卡。

使用TabHost

 getTabWidget().getChildAt(0).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // custom code tabHost.setCurrentTab(0); } }); 

使用TabLayout

 tabLayout.getTabAt(0)setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // custom code TabLayout.Tab tab = tabLayout.getTabAt(0); tab.select(); } } }); 

如果你想尝试android.support.design.widget.TabLayout ,你可以这样做:

 tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(Tab tab) { } @Override public void onTabUnselected(Tab tab) { } @Override public void onTabReselected(Tab tab) { } }); 
 mTabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { int i = mTabHost.getCurrentTab(); mTabHost.getTabWidget().getChildAt(i) .setBackgroundColor(Color.parseColor("#014a68")); //int m = mTabHost.getChildCount(); for (int j = 0; j <=3; j++) { if (j != i) mTabHost.getTabWidget() .getChildAt(j) .setBackgroundColor(Color.parseColor("#000000")); } } }); 

如果你有一个自定义的标签布局,你可能需要添加这个在你的自定义视图,它解决了我的问题:

 android:duplicateParentState="true"