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

时间:2012-04-02 18:57:40

标签: android android-widget

我正在尝试使用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");

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

11 个答案:

答案 0 :(得分:87)

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

答案 1 :(得分:50)

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

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

答案 2 :(得分:29)

使用这种方式:

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:

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

答案 3 :(得分:11)

只需将Selector设为textcolor

<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属性设置为set 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" />

答案 4 :(得分: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);

答案 5 :(得分: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" />

答案 6 :(得分:1)

答案 7 :(得分: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));

希望有帮助。

答案 8 :(得分:0)

  

您在所有情况下都使用了白色焦点,选择并按下了..

请使用不同颜色的测试。

还必须使用默认情况,并使用某种颜色 black 以及所有情况..当没有使用状态时,将应用默认值。

答案 9 :(得分:0)

最简单有效的解决方案:

  1. 将您的Xml颜色选择器创建为 res / color / your_color.xml
  2. 使用 ContextCompat util
  3. Ex :。txtview.setTextColor(ContextCompat.getColorStateList(context,R.color.tab_tv_selector));

答案 10 :(得分:0)

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

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

这些似乎都不起作用!

但是,最后,我不得不清理项目并使选择器在我的设备上工作。以这种经验为答案的想法会帮助其他开发人员。

因此,最终的工作版本如下。

  • android:duplicateParentState="true"文件夹中的选择器文件
  • 并且在/res/color中与TextView一起添加了