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

时间:2011-04-07 07:51:26

标签: android android-widget

我有一个像这样的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事件中,我还想更改所有选项卡的文本颜色。请帮助我如何更改活动中标签的文字颜色?

谢谢,

4 个答案:

答案 0 :(得分:52)

要更改选项卡的文本颜色,您需要获取视图,即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(.....);
    } 
希望这会有所帮助......

答案 1 :(得分:26)

用于新设计支持选项卡布局;您可以在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));

答案 2 :(得分:11)

对我来说@Farhan的解决方案没有用,因为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));
}

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

答案 3 :(得分:4)

当您使用findViewById(id)时,系统会要求系统查找ID为“id”相对的任何View到当前ViewGroup。这意味着您在代码中执行的操作是 this .findViewById(id),因此它将在当前视图中查找“id”。而findViewById(android.R.id.tabHost)不是很聪明,因为它不存在...

然而,当你执行getTabHost()时,你要求系统获得你的活动的唯一 tabHost,无论它是否有任何以root身份查看,即tabHost可以无法附加到它上面

作为结论,您应该始终在TabHostActivity中获取TabHost

希望我很清楚