【问题标题】:How do I change the background of an Android tab widget?如何更改 Android 选项卡小部件的背景?
【发布时间】:2010-01-20 08:30:39
【问题描述】:

我的课程扩展了 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)

谁能指导我如何更改所选标签的背景图像或颜色?

【问题讨论】:

    标签: android widget tabs


    【解决方案1】:

    这将设置您的标签颜色:

    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() 中,它会为选定的标签保持正确的颜色。

    【讨论】:

    • 非常感谢,这对我很有帮助。有没有办法在 XML 中实现这种方法?
    • @teoREtik XML 是静态内容,仅适用于您的活动首次启动时(布局初始化),所以没有。
    • 感谢您的帮助.. 这个答案非常有帮助.. +1 为此.. 加油..!!
    • 触摸时突出显示什么?
    • 我不喜欢这种方式。但我认为我们没有更好的方法
    【解决方案2】:

    正如 maird 提到的,更好的解决方案是使用 background 和选择器,这样您就不必检查 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 是一个带有选择器的 xml 可绘制对象:

    <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>
    

    对于完整的选项卡自定义,我将添加代码以使用自定义主题更改 选项卡文本样式。将此添加到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">
    

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

    【讨论】:

      【解决方案3】:

      如果注册 TabHost.OnTabChanged 事件并调用 mTab​​Host.getCurrentTabView() 获取 View,然后调用 view.setBackgroundResource() 会怎样?

      【讨论】:

        【解决方案4】:

        this 能解决您的问题吗?基本上使用选择器在每个选项卡视图上调用 setBackgroundDrawable?

        【讨论】:

          【解决方案5】:
          >     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>
          

          【讨论】:

            【解决方案6】:

            我在 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);
            

            我觉得这样做更好。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-07-27
              • 1970-01-01
              • 2018-01-19
              • 2013-04-01
              • 2011-10-30
              • 1970-01-01
              • 2018-02-04
              相关资源
              最近更新 更多