使用选择器来改变TextView文本颜色

55

我想使用TextView来定义TabHost上的TabWidget的样式。

我刚刚创建了一个背景颜色选择器,它运行良好,但是我想创建一个文本颜色选择器,但是文本颜色不改变:

这是我的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");
我知道文字颜色在任何情况下都必须是白色,但它并不是。
11个回答

107

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中,如下所示:

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_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="TextView"
    android:textColor="@‌​drawable/tab_text_sel‌​ector" />

15
确切地说,android:textColor="@drawable/tab_text_selector" 需要翻译。 - BAZTED
6
getColor不起作用,你需要使用getColorStateList(),正如@ffeandro的回答中提到的那样。在4.4.2上验证过。 - Ben Clayton
8
@BAZTED,你是否尝试过使用android:textColor="@drawable/tab_text_selector"来更改文本颜色?通过实际编写代码,你会发现android:textColor="@color/tab_text_selector"是正确的答案。我不知道为什么有人会赞同你的评论,因为它很容易误导人。 - Andy
1
@Andy 这取决于你把tab_text_selector.xml文件放在哪。根据我的经验,这些文件应该放在res/drawable文件夹中,但是这个答案说要把它放在res/color中,这显然可以工作,但有点不寻常。 - k2col

62
你需要使用 getColorStateList()。对于xml文件,请参考这里
我之前也遇到了这个问题。如果你想使用一个状态列表,你需要在颜色资源文件夹中声明它,而不是在drawable文件夹中,并使用setTextColor(getResources().getColorStateList(R.color.tab_text_selector))方法。

1
我已经进行了编辑,包括xml版本。这个答案是所有其他关于根据选择器状态更改TextView文本颜色的答案中最有帮助的。实际上,所有这些答案都在drawable选择器中使用了android:color。我想知道他们是否在回答之前尝试过它是否正确。 - Andy

30

可以使用以下方式:

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


6
你为什么要通过编程的方式来设置TextView的"textColor"?为什么不直接在layout中添加"android:textColor="@drawable/tab_text_selector""呢? - spaaarky21
2
Android Studio(我假设Eclipse也是如此)会抱怨getXml()需要一个XML资源并且会抛出红色下划线错误,但您仍然可以编译和运行您的应用程序。如果这让您感到困扰,请将选择器XML文件从R.drawable或R.color移动到R.xml,您的IDE应该停止抱怨。 - micnguyen

10
只需为文本颜色制作选择器。
<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_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/registration"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

你应该将 XML 添加到 res/color,并使用 @color/something 而不是 @drawable/something - Albert Vila Calvo

7

@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);

2
<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" />

1
创建一个选择器(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));

希望这有所帮助。

1

虽然你没有解释任何东西,但这个链接非常有帮助。 - SMBiggs

0

我遇到了一个不同的问题。我尝试了这个线程中建议的所有方法,包括以下内容:

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

但是,似乎这些都没有起作用!

然而,最终,我不得不清理项目,并让选择器在我的设备上工作。我认为将这个经验作为答案会帮助其他开发者。

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

  • /res/color文件夹中的选择器文件
  • 并且使用android:textColor="@color/text_selector"将其添加到TextView

0

最简单有效的解决方案:

  1. 将您的Xml颜色选择器创建到res/color/your_color.xml
  2. 使用ContextCompat工具

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


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