【问题标题】:Using selector to change TextView text color使用选择器更改 TextView 文本颜色
【发布时间】:2012-04-16 10:52:16
【问题描述】:

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

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

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

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

    【讨论】:

    • android:textColor="@drawable/tab_text_selector" 准确地说
    • getColor 将不起作用 - 您需要使用@ffeandro 的答案中提到的 getColorStateList() 。在 4.4.2 验证
    • @BAZTED 你试过android:textColor="@drawable/tab_text_selector" 来改变文字颜色吗?通过实际编写一些代码,您会意识到android:textColor="@color/tab_text_selector" 实际上是正确的答案。我不知道当你的评论具有误导性时,会有人如何支持你的评论。
    • @Andy 这取决于您将tab_text_selector.xml 文件放在哪里。以我的经验,这些放在res/drawable 文件夹中,但这个答案说把它放在res/color 中,这显然有效,但有点不寻常。
    【解决方案2】:

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

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

    【讨论】:

    • 我继续进行编辑以包含 xml 版本。在所有其他关于根据选择器状态更改 TextView 的 textcolor 的答案中,这个答案是最有帮助的。从字面上看,他们都在可绘制选择器中说android:color。我想知道他们中的任何人在回答之前是否真的尝试过,认为这是正确的。
    【解决方案3】:

    这样使用:

    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

    【讨论】:

    • 您是否有理由以编程方式设置 TextView 的 textColor?为什么不直接在布局中添加android:textColor="@drawable/tab_text_selector"
    • Android Studio(我假设是 Eclipse)会抱怨 getXml() 需要 XML 资源并抛出红色下划线错误,但您仍然可以编译和运行您的应用程序。如果这让您感到困扰,请将选择器 XML 文件从 R.drawable 或 R.color 移到 R.xml 中,您的 IDE 应该停止抱怨。
    【解决方案4】:

    只需为 textcolor 制作 Selector

    <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 一起使用
    【解决方案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);
    

    【讨论】:

      【解决方案6】:
      <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" />
      

      【讨论】:

        【解决方案7】:

        【讨论】:

        • 虽然您什么都不解释,但该链接非常有帮助。
        【解决方案8】:

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

        希望对你有帮助。

        【讨论】:

          【解决方案9】:

          您在所有情况下都使用了白色 focus 、 selected 和 press ..

          请使用不同的颜色进行测试。

          还必须使用带有某种颜色的默认大小写,例如 黑色 以及所有大小写。当不使用任何状态时,将应用默认值。

          【讨论】:

            【解决方案10】:

            最简单有效的解决方案:

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

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

            【讨论】:

              【解决方案11】:

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

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

              这些似乎都不起作用!

              但是,最后,我不得不清理项目并让选择器在我的设备上工作。认为将此经验作为答案将有助于其他开发人员。

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

              • /res/color 文件夹中的选择器文件
              • 并在TextView 中添加了android:textColor="@color/text_selector"

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-30
                • 1970-01-01
                • 2019-07-10
                • 1970-01-01
                • 2020-11-23
                相关资源
                最近更新 更多