【问题标题】:Change clickable TextView's color on focus and click?在焦点上更改可单击的 TextView 的颜色并单击?
【发布时间】:2011-07-19 07:22:55
【问题描述】:

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

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 文件时,无论我是否按下它,textcolor 都会变成灰色。这很奇怪,因为我在所有颜色字段中都写了“#000000”。
但是如果我删除 setTextColor 代码,让 textView 变成浅灰色,当我按下它时,它变成黑色。但这不是我想要的颜色。

那么,谁能帮我解决这个问题?

澄清一下:我希望能够在文本正常、按下和聚焦时指定文本的颜色。

【问题讨论】:

  • 对于通过搜索引用此页面的人,如果您希望使用颜色而不是 ColorStateList,请参考我的回答。我的解决方案无需在 Java 中编写任何代码即可工作 :)

标签: android colors onclick textview hyperlink


【解决方案1】:

对我来说,这种方式很有效:

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

【讨论】:

    【解决方案2】:

    如果你想从代码中设置有状态的颜色,你需要将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 设置为文本颜色的更新:

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

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

    使用 XML 就这么简单:

    android:textColor="@color/selector_txt"
    

    【讨论】:

    • 我将我的 XML 文件更改为您建议的内容,并搜索了我应该如何在 setTextColor 方法中发送 ColorStateList。我发现这篇有用的帖子:anddev.org/post27828.html#p27828 所以现在一切正常。 :) 但是,我需要在 xml 文档中稍微调整一下状态。
    • @Daniel Jonsson 我已将帖子中的代码添加到答案中,因此对其他人来说会更容易。
    • 以编程方式设置它使用这个:myTextView.setTextColor(getResources().getColorStateList(R.color.selector_txt));
    【解决方案3】:

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

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

    【讨论】:

    • 太好了,就是这样
    • 对于那些需要编程解决方案的人的最佳答案!像魅力一样工作!
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        这很简单。试试这个。它对我有用:

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 完美节省我的时间老兄:)
          【解决方案8】:

          第1步:像这样设置xml中的文本颜色

          android:textColor="@color/text_color"

          第二步:创建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>
          

          【讨论】:

          • @AlwaysConfused,为什么?什么是设备、操作系统版本?
          【解决方案9】:

          查看 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));
          

          【讨论】:

          • 非常感谢您的帮助!现在它实际上从文件中读取颜色。 :) 但是,我仍然遇到问题。它只是读取默认颜色。点击文字后颜色不会改变,很奇怪。你知道这是什么原因吗?
          • 应该是getResources().getColorStateList,而不是getResources().getColor
          • @Patrick 是的,getResources().getColorStateList 确实有效。
          • 请注意,从 API 23 开始,此方法已被弃用:developer.android.com/reference/android/content/res/…
          • ContextCompat.getColorStateList(this,R.color.textcolor) 可用于摆脱弃用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-21
          • 2011-06-05
          • 2014-06-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多