在焦点上更改可点击的TextView的颜色并单击?

时间:2011-03-20 21:43:27

标签: android colors onclick textview hyperlink

我有一个可点击的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); 来使用textcolor文件时,无论是否按下它,文本颜色都会变为灰色。这很奇怪,因为我在所有颜色区域都写了“#000000” 但是如果我删除了setTextColor代码,则将textView变为浅灰色,当我按下它时,它变为黑色。但那不是我想要的颜色。

那么,任何人都可以帮我解决这个问题吗?

只是为了澄清:我希望能够在文本正常,按下和聚焦时指定文本的颜色。

9 个答案:

答案 0 :(得分:57)

如果要从代码中设置有状态颜色,则需要将ColorStateList作为参数传递给setTextColor,将int传递给方法会导致将颜色设置为所有状态。看起来你的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设置为文字颜色的UPD:

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 :(得分:42)

步骤1:像这样设置文本颜色

  

机器人:文字颜色= “@颜色/ 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>

答案 2 :(得分:16)

尝试这个..它对我有用:

文件名: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"

答案 3 :(得分:10)

查看R.java类(它是自动生成的)。你有类似的东西:

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

所以在您的代码中:

title.setTextColor(R.color.textcolor);

您不是从textcolor.xml设置值,而是从R.java设置值(包含textcolor.xml地址)。设置颜色的有效方法是:

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

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:0)

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

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

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