使用选择器更改 TextView 文本颜色
Posted
技术标签:
【中文标题】使用选择器更改 TextView 文本颜色【英文标题】:Using selector to change TextView text color 【发布时间】: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");
我知道在任何情况下文本颜色都必须是白色的,但事实并非如此。
【问题讨论】:
【参考方案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_
android:layout_
android:gravity="center_horizontal"
android:text="TextView"
android:textColor="@drawable/tab_text_selector" />
【讨论】:
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_
android:layout_
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】:这里是 android 开发者的参考 http://developer.android.com/guide/topics/resources/color-list-resource.html
【讨论】:
虽然您什么都不解释,但该链接非常有帮助。【参考方案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】:最简单有效的解决方案:
-
在 res/color/your_color.xml 中创建您的 Xml 颜色选择器
使用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"
【讨论】:
以上是关于使用选择器更改 TextView 文本颜色的主要内容,如果未能解决你的问题,请参考以下文章