如何更改Android选项卡窗口小部件的背景?

我的类扩展了TabActivity

TabHost mTabHost = getTabHost(); TabHost.TabSpec tab1 =mTabHost.newTabSpec("tab1"); TabHost.TabSpec tab2 =mTabHost.newTabSpec("tab2"); tab1 .setIndicator("title tab1"); tab2 .setIndicator("title tab2"); mTabHost.addTab(tab1);mTabHost.addTab(tab2); TabHost.setCurrentTab(0 or 1) 

任何人都可以指导我如何更改所选标签的背景图像或颜色?

如果你注册了TabHost.OnTabChanged事件并调用mTabHost.getCurrentTabView()来获得View,那么view.setBackgroundResource()呢?

这将设置你的标签颜色:

 public static void setTabColor(TabHost tabhost) { for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) { tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#FF0000")); //unselected } tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor("#0000FF")); // selected } 

如果将它放在onTabChangedListener()中,它将为选定的选项卡保留正确的颜色。

正如mbaird提到的,更好的解决scheme是使用select器的背景 ,所以你不必检查onTabChanged并手动更新。 最小代码在这里:

 private void initTabsAppearance(TabWidget tabWidget) { // Change background for(int i=0; i < tabWidget.getChildCount(); i++) tabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_bg); } 

其中tab_bg是一个带有select器的xml drawable:

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@drawable/tab_bg_selected" /> <item android:drawable="@drawable/tab_bg_normal" /> </selector> 

对于完整的Tab自定义,我将添加使用自定义主题更改选项卡文本样式的代码。 将其添加到styles.xml

 <resources> <style name="MyCustomTheme" parent="@android:style/Theme.Light.NoTitleBar"> <item name="android:tabWidgetStyle">@style/CustomTabWidget</item> </style> <style name="CustomTabWidget" parent="@android:style/Widget.TabWidget"> <item name="android:textAppearance">@style/CustomTabWidgetText</item> </style> <style name="CustomTabWidgetText" parent="@android:style/TextAppearance.Widget.TabWidget"> <item name="android:textSize">12sp</item> <item name="android:textStyle">bold</item> </style> </resources> 

要使用这个主题,请在AndroidManifest.xml中定义它:

 <application android:theme="@style/MyCustomTheme"> 

现在你有了自定义背景自定义文本样式的标签小部件。

这是否解决您的问题? 基本上每个选项卡视图调用setBackgroundDrawableselect器?

 > TabHost mTabHost = getTabHost(); > > TabHost.TabSpec tab1 =mTabHost.newTabSpec("tab1"); > TabHost.TabSpec tab2 =mTabHost.newTabSpec("tab2"); > > tab1.setIndicator("title tab1"); > tab2.setIndicator("title tab2"); > mTabHost.addTab(tab1) ;mTabHost.addTab(tab2); > > TabHost.setCurrentTab(0 or 1); mTabHost.getTabWidget().getChildAt(0).setBackgroundResource(R.drawable.tab1selector); mTabHost.getTabWidget().getChildAt(1).setBackgroundResource(R.drawable.tab2selector); mTabHost.getTabWidget().getChildAt(2).setBackgroundResource(R.drawable.tab3selector); mTabHost.getTabWidget().getChildAt(3).setBackgroundResource(R.drawable.tab4selector); 

使用.setBackgroundResource和tabNselector是一个XML – tabNselector.xml

  <?xml version="1.0" encoding="UTF-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="false" android:drawable="@drawable/tabN"/> <item android:state_selected="true" android:drawable="@drawable/tabNsel" /> </selector> 

我在XML的TabWidget元素中设置了“android:background”参数,以提供所有选项卡的一般背景。

然后我在“.setIndicator”方法中通过另一个XML膨胀的观点。

  View v = LayoutInflater.from(this).inflate(R.layout.tab_widget, null); TextView label = (TextView) v.findViewById(R.id.tabLabel); label.setText("Whatever"); tab1 .setContent(v); 

我觉得这是一个更好的方法。