如何在安卓系统中更改标签指示器文本的颜色?

25

如何更改选项卡文本指示器的颜色?我可以使用选择器标记更改图标,参考示例。但是无法更改文本颜色。怎么办?

4个回答

29

在我进行一些网络搜索之后,我发现了来自Fred Grott(http://knol.google.com/k/fred-grott/advance-tabs/)的新答案。


这使得您可以设置文本颜色的选择器,因此在选定或未选定标签时可以使用不同的颜色。如果您正在使用不同的背景颜色来表示选中的标签,则这非常有用。当然,您也可以只使用纯色而不是选择器。

final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title);        
tv.setTextColor(this.getResources().getColorStateList(R.color.text_tab_indicator));

R.color.text_tab_indicator是位于你的res/drawable文件夹中的选择器xml文件



换句话说,指示器文本确实是一个TextView,可以通过从TabWidget对象访问的View对象检索到。
有关变量声明以及其他技巧的更多信息和上下文,请查看Fred的示例。


tv为空,findViewById(android.R.id.title)无法找到它。 - trampster

24

在您的自定义主题中进行样式更改

<item name="android:tabWidgetStyle">@android:style/Widget.TabWidget</item> 

<style name="Widget.TabWidget">
        <item name="android:textAppearance">@style/TextAppearance.Widget.TabWidget</item>
        <item name="android:ellipsize">marquee</item>
        <item name="android:singleLine">true</item>
</style>  


<style name="TextAppearance.Widget.TabWidget">
    <item name="android:textSize">14sp</item>
    <item name="android:textStyle">normal</item>
    <item name="android:textColor">@android:color/tab_indicator_text</item>
</style>     

3
@DroidBase, @Alex Volovoy,请问我应该把样式放在哪里?当我将其作为单独的XML文件放在values文件夹下时,出现了错误:“Error retrieving parent for item: No resource found that matches the given name 'Widget'.” - Mithun Sreedharan
@Mithun:请发布一些代码片段以找到确切的解决方案。我猜你没有提及父属性,这将覆盖 XML 对象的默认样式。 - Praveen
嘿@Alex,看起来很不错,但我不能尝试...这是我第一次使用样式...您能详细说明一下您想要表达什么吗?@DroidBase,你能否解释一下你在apidemos评论中想说什么? - Farhan
1
@Farhan,根据您使用的父主题,您可以添加类似于<style name="Widget.TabWidget" parent="@android:style/Theme.Holo"></style>的内容。这将使属性被找到。 - Robert
1
这是一个不错的解决方案,但只有在Robert在这里设置父级时才对我有效。为了设置必要的属性parent而不必找出另一个你想使用的主题,你可以使用parent="@style/AppTheme"来在styles.xml中使用现有的AppTheme样式。 - Gene Bo

20

Danny C的答案是100%正确的。我只想添加一些内容,以便使用资源文件制作完整答案。

在res/color文件夹下的text_tab_indicator文件。

<?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:textColor="@color/text_tab_selected"
    android:state_selected="true" />
<item android:textColor="@color/text_tab_unselected"
    android:state_selected="false" />
</selector>

这个 text_tab_unselected & text_tab_selected 在 colors/values 文件夹下会看起来像这样

<resources> 
<color name="text_tab_selected">#ffffff</color>
<color name="text_tab_unselected">#95ab45</color>

最后,在选项卡类文件中添加Dannyy的答案。

final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title);        
tv.setTextColor(this.getResources().getColorStateList(R.color.text_tab_indicator));

3
text_tab_indicator.xmlж–Ү件дёӯзҡ„android:textColorеә”иҜҘж”№дёәandroid:colorгҖӮ - iStar
2
getColorStateList已被弃用,因此请使用ContextCompat.getColorStateList(context, R.color.text_tab_indicator)。 - CoolMind
失败的原因是tv为空,似乎无法找到id为title的TextView。我的代码在包含TabLayout的片段的OnCreate中。 - trampster

6
颜色的变化也可以不使用Java来说明,这可能更好。
我对text_tab_indicator进行了修改(注意将textColor改为“color”):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="@color/text_tab_selected" />
    <item android:state_selected="false" android:color="@color/text_tab_unselected" />
</selector>

将TabWidget的样式设置为指向xml代码中的特定样式:

<TabWidget
    ...
    style="@style/TabText"
    />

请在样式中将位于 /res/color 中的 text_tab_indicator 声明为您想要的颜色。
<style name="TabText">
    <item name="android:textColor">@color/tab_text_color</item>
</style>

对我来说,它像魔法一样奏效。

谢谢, Randall


尽管这个解决方案看起来完美,但它在我的两个设备上(Android 5和2.3)都没有起作用。 - CoolMind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接