使用选择器更改 TextView 文本颜色

Posted

技术标签:

【中文标题】使用选择器更改 TextView 文本颜色【英文标题】:Using selector to change TextView text color 【发布时间】:2012-04-16 10:52:16 【问题描述】:

我正在尝试使用 TextView 在 tabhost 上定义 TabWidget 的样式。

我刚刚为 bgcolor 创建了一个选择器并且工作正常,但我想为 textColor 创建一个选择器,但文本颜色不会改变:

这是我的 tab_text_selector.xml:

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

</selector>

这是我尝试在 textView 上使用时的代码:

TextView txtTab=new TextView(this);
        txtTab.setTextColor(R.drawable.tab_text_selector);
        txtTab.setBackgroundResource(R.drawable.tab_bg_selector);
        txtTab.setGravity(Gravity.CENTER);
        txtTab.setText("Agregar Idea");

我知道在任何情况下文本颜色都必须是白色的,但事实并非如此。

【问题讨论】:

【参考方案1】:

1) 使用 tab_text_selector.xml 如下,放入 res/color 文件夹:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="@android:color/white" />
    <item android:state_focused="true" android:color="@android:color/white" />
    <item android:state_pressed="true" android:color="@android:color/white" />
    <item android:color="#504f4f" /> <!-- default case -->
</selector>

并将其设置为您的文本视图,如下所示..

TextView tv = (TextView) findViewById(R.id.TextView1) ;
tv.setTextColor(context.getResources().getColor(R.color.tab_text_selector));

2) 第二个选项是如果您在 xml 中使用 textview 而不是以编程方式使用,则使用 tab_text_selector.xml 如下:

<TextView
    android:id="@+id/textView1"
    android:layout_
    android:layout_
    android:gravity="center_horizontal"
    android:text="TextView"
    android:textColor="@‌​drawable/tab_text_sel‌​ector" />

【讨论】:

android:textColor="@drawable/tab_text_selector" 准确地说 getColor 将不起作用 - 您需要使用@ffeandro 的答案中提到的 getColorStateList() 。在 4.4.2 验证 @BAZTED 你试过android:textColor="@drawable/tab_text_selector" 来改变文字颜色吗?通过实际编写一些代码,您会意识到android:textColor="@color/tab_text_selector" 实际上是正确的答案。我不知道当你的评论具有误导性时,会有人如何支持你的评论。 @Andy 这取决于您将tab_text_selector.xml 文件放在哪里。以我的经验,这些放在res/drawable 文件夹中,但这个答案说把它放在res/color 中,这显然有效,但有点不寻常。【参考方案2】:

你必须使用getColorStateList()。对于 xml,请参阅here。

我也在努力解决这个问题。如果你想使用state list,你需要在color资源文件夹中声明它,而不是drawable文件夹,并使用setTextColor(getResources().getColorStateList(R.color.tab_text_selector))方法。

【讨论】:

我继续进行编辑以包含 xml 版本。在所有其他关于根据选择器状态更改 TextView 的 textcolor 的答案中,这个答案是最有帮助的。从字面上看,他们都在可绘制选择器中说android:color。我想知道他们中的任何人在回答之前是否真的尝试过,认为这是正确的。【参考方案3】:

这样使用:

tab_text_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:color="#FF111111"/>  
    <item android:state_focused="true" android:color="#FF222222"/>    
    <item android:state_selected="true" android:color="#FF333333"/> 
</selector>

文本视图:

TextView txtTab = new TextView(this);

XmlResourceParser xrp = getResources().getXml(R.drawable.tab_text_selector);  
try   
    ColorStateList csl = ColorStateList.createFromXml(getResources(), xrp);  
    txtTab.setTextColor(csl);  
 catch (Exception e)    

txtTab.setBackgroundResource(R.drawable.tab_bg_selector);
txtTab.setGravity(Gravity.CENTER);
txtTab.setText("Agregar Idea");

但最好把颜色放在/res/color/yourcolor.xml

【讨论】:

您是否有理由以编程方式设置 TextView 的 textColor?为什么不直接在布局中添加android:textColor="@drawable/tab_text_selector" Android Studio(我假设是 Eclipse)会抱怨 getXml() 需要 XML 资源并抛出红色下划线错误,但您仍然可以编译和运行您的应用程序。如果这让您感到困扰,请将选择器 XML 文件从 R.drawable 或 R.color 移到 R.xml 中,您的 IDE 应该停止抱怨。【参考方案4】:

只需为 textcolor 制作 Selector

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/drawer_color" />
<item android:state_focused="false" android:color="@android:color/white" />
<item android:state_selected="true" android:color="@color/drawer_color" />

然后设置Textview的textColor属性设置clickable=true

<TextView
    android:clickable="true"
    android:textColor="@drawable/text_selector"
    android:layout_
    android:layout_
    android:text="@string/registration"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

【讨论】:

您应该将 XML 添加到 res/color 并与 @color/something 而不是 @drawable/something 一起使用【参考方案5】:

@ffleandro,@ρяσѕρєя K 回答最佳变体,我认为使用 ColorStateList 是旧版本和最新版本 Android 的最佳选择。

int[][] states = new int[][] 
    new int[]  android.R.attr.state_pressed, // pressed
    new int[]  android.R.attr.state_focused, // focused
    new int[] 
;
int[] colors = new int[] 
    getResources().getColor(R.color.green_color), // green
    getResources().getColor(R.color.green_color), // green
    getResources().getColor(R.color.white)  // white
;
ColorStateList list = new ColorStateList(states, colors);
mTextView.setFocusable(true);
mTextView.setClickable(true);
mTextView.setTextColor(list);

【讨论】:

【参考方案6】:
<item android:state_selected="true" android:color="@android:color/white" />
<item android:state_focused="true" android:color="@android:color/red" />
<item android:state_pressed="true" android:color="@android:color/blue" />

【讨论】:

【参考方案7】:

这里是 android 开发者的参考 http://developer.android.com/guide/topics/resources/color-list-resource.html

【讨论】:

虽然您什么都不解释,但该链接非常有帮助。【参考方案8】:

创建一个选择器(text_color_selector.xml)并将其放入 res/color 文件夹:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorPrimary" android:state_pressed="true" /> <!-- pressed -->
    <item android:color="@color/colorPrimary" android:state_focused="true" /> <!-- focused -->
    <item android:color="@color/light_gray_b" /> <!-- default -->
</selector>

将此添加到您的 Textview 中:

        <TextView
            android:id="@+id/tvMenuName"
            style="@style/TextViewStyle"
            android:layout_marginLeft="@dimen/dimen_15"
            android:layout_marginStart="@dimen/dimen_15"
            android:textColor="@color/text_color_selector"
            android:textSize="@dimen/text_size_16"
            tools:text="Home" />

您可以通过编程方式设置 Textview:

TextView tv = (TextView) findViewById(R.id.textView) ;
tv.setTextColor(context.getResources().getColor(R.color.text_color_selector));

希望对你有帮助。

【讨论】:

【参考方案9】:

您在所有情况下都使用了白色 focus 、 selected 和 press ..

请使用不同的颜色进行测试。

还必须使用带有某种颜色的默认大小写,例如 黑色 以及所有大小写。当不使用任何状态时,将应用默认值。

【讨论】:

【参考方案10】:

最简单有效的解决方案:

    res/color/your_color.xml 中创建您的 Xml 颜色选择器 使用ContextCompat实用工具

Ex.: txtview.setTextColor(ContextCompat.getColorStateList(context, R.color.tab_tv_selector));

【讨论】:

【参考方案11】:

我有一个不同的问题。我尝试了该线程中建议的所有内容,包括以下内容

将选择器从drawable 文件夹移动到color 文件夹。 设置android:clickable="true" 设置android:duplicateParentState="true"

这些似乎都不起作用!

但是,最后,我不得不清理项目并让选择器在我的设备上工作。认为将此经验作为答案将有助于其他开发人员。

因此,最终的工作版本具有以下内容。

/res/color 文件夹中的选择器文件 并在TextView 中添加了android:textColor="@color/text_selector"

【讨论】:

以上是关于使用选择器更改 TextView 文本颜色的主要内容,如果未能解决你的问题,请参考以下文章

更改颜色选择器/文本新文本 MaterialButton

更改时间选择器的文本颜色 [android]

更改日期选择器的文本颜色

如何在grapesjs的默认富文本编辑器上添加颜色选择器来更改字体颜色?

如何快速更改选择器视图的文本颜色? [复制]

使用颜色选择器更改片段中edittext的背景颜色