在焦点和点击时更改可点击的TextView的颜色?

32

我有一个可点击的TextView,我想给它添加一些颜色。但我不知道怎么做。以下是我正在使用的两个文件中相关代码片段:

TextView title = new TextView(this);
title.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
title.setTextColor(R.color.textcolor);
title.setText(titleLine);
title.setTypeface(null, Typeface.BOLD);
title.setClickable(true);
title.setId(idLine);
title.setFocusable(true);

title.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

                /* Irrelevant code */                   

    }
});

这是我的textcolor.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="#000000"/> <!-- pressed -->
    <item android:state_focused="true"
          android:color="#000000"/> <!-- focused -->
    <item android:color="#000000"/> <!-- default -->
</selector>
当我使用title.setTextColor(R.color.textcolor);这段代码时,文本颜色变为灰色,无论我是否按下它。这很奇怪,因为我在所有颜色字段中都写了"#000000"。
但是如果我删除setTextColor代码,textView就会变成浅灰色,当我按下它时,它会变成黑色。但那不是我想要的颜色。
所以,有人可以帮助我解决这个问题吗?
只是为了澄清一下:我想能够指定文本在普通、按下和聚焦时的颜色。

如果您正在寻找使用颜色而不是ColorStateList的解决方案,请参考我的答案。我的解决方案无需编写任何Java代码即可运行 :) - Mahendra Liya
9个回答

69

如果您想从代码设置有状态的颜色,您需要将 ColorStateList 作为参数传递给 setTextColor 方法。如果向该方法传递一个整数,结果会将颜色设置为所有状态。此外,您的xml文件似乎不完全正确。 ColorStateList 文档中的示例应如下所示(应位于此处:res/color/selector_txt.xml):

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:color="@color/testcolor1"/>
    <item android:state_pressed="true" android:state_enabled="false" android:color="@color/testcolor2" />
    <item android:state_enabled="false" android:color="@color/testcolor3" />
    <item android:color="@color/testcolor5"/>
 </selector>

更新了如何将ColorStateList设置为文本颜色:

ColorStateList cl = null;
try {
   XmlResourceParser xpp = getResources().getXml(R.color.selector_txt);
   cl = ColorStateList.createFromXml(getResources(), xpp);
} catch (Exception e) {}

注意: 在API级别23中,方法createFromXml(Resources, XmlPullParser parser)已被弃用。 请使用createFromXml(Resources, XmlPullParser parser, Theme)

对于XML,操作如下:

android:textColor="@color/selector_txt"

1
我按照你的建议更改了XML文件,并搜索了一下setTextColor方法中应该如何发送ColorStateList。我找到了这篇有用的帖子:http://www.anddev.org/post27828.html#p27828,现在一切都正常工作了。 :) 不过,我需要在XML文档中微调一下状态。 - Daniel Jonsson
@Daniel Jonsson 我已经将帖子中的代码添加到答案中,这样其他人就更容易了解了。 - Konstantin Burov
1
要在程序中进行设置,请使用以下代码:myTextView.setTextColor(getResources().getColorStateList(R.color.selector_txt)); - phil

50

步骤1:在xml中设置文本颜色,如下所示:

android:textColor="@color/text_color"

步骤2:创建res/color/text_color.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:state_pressed="true"
      android:color="#ffffffff"/> <!-- pressed -->
<item android:state_focused="true"
      android:color="#ff0000ff"/> <!-- focused -->
<item android:color="#ff000000"/>  <!--default -->

</selector>

@总是困惑,为什么?设备和操作系统版本是什么? - CoolMind

17

试试这个方法,对我有效:

文件名:res/color/bg_tab_text_color.xml

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

尝试在xml布局文件中设置颜色,如下所示:

android:textColor="@color/bg_tab_text_color"

完美,节省了我的时间,伙计 :) - Ramkesh Yadav

10

查看R.java类(它会自动生成)。您会看到以下内容:

 public static final class color {
        public static final int gray_transparent=0x7f050001;
}

所以在你的代码中,在这一行:

title.setTextColor(R.color.textcolor);

您没有使用来自textcolor.xml的值,而是使用了R.java中的int值(其中包含textcolor.xml的地址)。设置颜色的有效方法是:

title.setTextColor(getResources().getColorStateList(R.color.textcolor));

非常感谢您的帮助!现在它实际上从文件中读取颜色。 :)然而,我仍然有一个问题。它只是读取默认颜色。如果我点击文本,颜色不会改变,这很奇怪。您知道是什么原因吗? - Daniel Jonsson
3
ه؛”该ن½؟用getResources().getColorStateList,而ن¸چوک¯getResources().getColorم€‚ - Patrick
@Patrick,是的,getResources().getColorStateList真的很好用。 - anticafe
请注意,此方法已在API 23中弃用:https://developer.android.com/reference/android/content/res/Resources.html#getColorStateList(int) - Jake Lee
ContextCompat.getColorStateList(this,R.color.textcolor) 可以用来消除废弃警告。 - Mehul Joisar

5

这是一种非常简单的编程方式:

private void setColorStateList(TextView view) {
        int[][] states = new int[][] {
                new int[] { android.R.attr.state_pressed}, // pressed
                new int[] { android.R.attr.state_focused}, // focused
                new int[] { android.R.attr.state_enabled}  // enabled
        };

        int[] colors = new int[] {
                getResources().getColor(R.color.blue),
                getResources().getColor(R.color.green),
                getResources().getColor(R.color.green) 
        };

        ColorStateList list = new ColorStateList(states, colors);
        view.setTextColor(list);
        view.setClickable(true);
        view.setFocusableInTouchMode(true);
    }

1
优秀,就是这样 - ucMedia
最佳答案适用于那些需要编程解决方案的人!运行得很好! - porlicus

3
非常简单。试试这个方法。对我有效:
文件名:res/color/bg_tab_text_color.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true" android:drawable="@color/blue" />

尝试在xml布局中设置颜色:

android:textColor="@color/bg_tab_text_color"

1
在res/drawable/tab_textColor.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="#FFFFFF" />
    <item android:state_pressed="true" android:color="#FFFFFF" />
    <item android:color="#CCCCCC" />
</selector>



<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/icon"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="5dp"
    android:text="@string/tab_indicator_home"
    android:textColor="@drawable/tab_textcolor"
    android:textSize="10sp"
    android:visibility="visible"
    tools:ignore="SmallSp" />

0

在 res/color/text_selector.xml 文件中:

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

在布局中:

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Word"
    android:textColor="@color/text_selector"
    android:textSize="12sp"/>

在代码中:

textView.setSelected(false); // To deselect.
textView.setSelected(true);

0
对我来说,只有这种方法有效:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/colorSelected" />
    <item android:state_pressed="false" android:color="@color/colorDefault" />
</selector>

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