Android:以编程方式更改选项卡文本颜色

我有一个像这样的TabHost:

<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/tabhost" android:background="@drawable/tabs_bg"> <LinearLayout android:id="@+id/LinearLayout01" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent"> <TabWidget android:id="@android:id/tabs" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginBottom="5dip"> </TabWidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_height="fill_parent" android:layout_width="fill_parent"> </FrameLayout> </LinearLayout> 

我正在像这样以编程方式向此TabHost添加选项卡:

 tabHost = (TabHost)findViewById(android.R.id.tabhost); tabHost.setOnTabChangedListener(this); /* tid1 is firstTabSpec Id. Its used to access outside. */ TabSpec firstTabSpec = tabHost.newTabSpec("tid1"); TabSpec secondTabSpec = tabHost.newTabSpec("tid2"); TabSpec ThirdTabSpec = tabHost.newTabSpec("tid3"); /* TabSpec setIndicator() is used to set name for the tab. */ /* TabSpec setContent() is used to set content for a particular tab. */ firstTabSpec.setIndicator("Tab1", getResources().getDrawable(R.drawable.tab1)); secondTabSpec.setIndicator("Tab2", getResources().getDrawable(R.drawable.tab2)); ThirdTabSpec.setIndicator("Tab3", getResources().getDrawable(R.drawable.tab3)); firstTabSpec.setContent(new Intent(this,FirstTab.class)); secondTabSpec.setContent(new Intent(this,SecondTab.class)); ThirdTabSpec.setContent(new Intent(this,ThirdTab.class)); /* Add tabSpec to the TabHost to display. */ tabHost.addTab(firstTabSpec); tabHost.addTab(secondTabSpec); tabHost.addTab(ThirdTabSpec); for(int i=0;i<tabHost.getTabWidget().getChildCount();i++) { tabHost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#121312")); } tabHost.getTabWidget().setCurrentTab(0); tabHost.getTabWidget().getChildAt(0).setBackgroundColor(Color.parseColor("#f1a026")); 

这里是onTabChanged事件:

 public void onTabChanged(String tabId) { // TODO Auto-generated method stub for(int i=0;i<tabHost.getTabWidget().getChildCount();i++) { tabHost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#121312")); } tabHost.getTabWidget().getChildAt(tabHost.getCurrentTab()).setBackgroundColor(Color.parseColor("#f1a026")); } 

在onTabChanged事件中,我也想更改所有选项卡的文本颜色。 请帮助我如何更改事件中选项卡的文本颜色?

谢谢,

Solutions Collecting From Web of "Android:以编程方式更改选项卡文本颜色"

要改变标签的文本颜色,你需要得到的视图,即TextView被设置为标签的标题,你可以像这样改变它:

  TabHost tabhost = getTabHost(); for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) { TextView tv = (TextView) tabhost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); tv.setTextColor(.....); } 

希望这可以帮助….

对于新的devise支持选项卡布局; 你可以在你的xml中定义它
app:tabTextColor="@color/tab_inactive" app:tabSelectedTextColor="@color/tab_active"
例如 –

 <android.support.design.widget.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tabanim_tabs" app:tabTextColor="@color/tab_inactive" app:tabSelectedTextColor="@color/tab_active" android:textAllCaps="false" /> 

在编程上它可能是这样的:

 tabLayout.setTabTextColors(ContextCompat.getColorStateList(this, R.color.tab_selector)); tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.indicator)); 

对我来说@Farhan的解决scheme没有工作,因为getChildCount()保持返回1同时有四个选项卡。 使用getTabCount()getChildTabViewAt()解决了我的问题:

 for (int tabIndex = 0 ; tabIndex < mTabHost.getTabWidget().getTabCount() ; tabIndex ++) { View tab = mTabHost.getTabWidget().getChildTabViewAt(tabIndex); TextView t = (TextView)tab.findViewById(android.R.id.title); t.setTextColor(getResources().getColor(R.color.white)); } 

我以为我发布这个替代scheme的人有同样的问题。

当您使用findViewById(id)时,您要求系统查找与当前ViewGroup 相对的id为“id”的View。 这意味着你在你的代码中做的是这个 .findViewById(id),所以它会在当前视图中查找“id”。 和做findViewById(android.R.id.tabHost)是不是很聪明,因为它只是不存在…

但是,当您执行getTabHost()时,您会要求系统获取您的活动的唯一 tabHost,而不pipe它是否具有任何View作为根,也就是说,TabHost可以附加到没有任何内容。

作为结论,你应该总是在你的TabHostActivity中使用TabHost

希望我清楚