Android多功能按钮Drawable显示异常求助:文本颜色与预期不符
嘿,我一眼就看出问题出在哪了——你设置文本颜色的方式错了,导致旧的颜色状态和新的叠加在一起,才出现颜色不符的情况。
问题根源
看你代码里的这行:
bth.setTextColor(R.drawable.change_text_color);
setTextColor()如果直接传int类型的资源ID,系统会把它当成单一颜色值(比如把R.drawable.change_text_color对应的数值当成颜色码),而不是去加载你写的颜色selector文件。这样原来按钮设置的@drawable/change_text_color_black和这个错误的颜色值就叠加显示了,自然和你预期的不一样。
正确的解决步骤
1. 修正代码里的setTextColor调用
你需要先把颜色selector加载成ColorStateList,再传给按钮:
// 兼容低版本的写法,记得导入androidx.core.content.ContextCompat import androidx.core.content.ContextCompat; // 替换原来的错误行 bth.setTextColor(ContextCompat.getColorStateList(this, R.drawable.change_text_color));
如果你的项目没用到AndroidX,也可以用旧版API(注意API 23+和低版本的区别):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { bth.setTextColor(getResources().getColorStateList(R.drawable.change_text_color, getTheme())); } else { bth.setTextColor(getResources().getColorStateList(R.drawable.change_text_color)); }
2. 规范颜色selector的存放位置
虽然Drawable目录也能放颜色selector,但官方标准是把它放在res/color目录下,这样系统加载更稳定,不容易出问题。把你的change_text_color.xml移到res/color里,之后引用的时候就可以写成@color/change_text_color,代码里的资源ID也会变成R.color.change_text_color。
3. 检查按钮的初始设置
你的按钮初始xml里设置了android:textColor="@drawable/change_text_color_black",同样建议把这个文件也移到res/color目录下,改成android:textColor="@color/change_text_color_black"。
修正后的完整代码片段
if (bsc.getText().toString().equals(getResources().getString(R.string.inotpaid))) { tfr.setText(R.string.select_pay_way); tsc.setText(R.string.also); bfr.setText(R.string.app_intro); bsc.setText(R.string.site_way); bth.setText(R.string.bank_way); bth.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_style_trans)); // 这里是修正后的颜色设置 bth.setTextColor(ContextCompat.getColorStateList(this, R.color.change_text_color)); }
规范的颜色selector示例(res/color/change_text_color.xml)
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/blueyellows" android:state_pressed="true"/> <item android:color="#ffffff"/> </selector>
按这个方法改完,按钮切换状态时的文本颜色就会正常显示,不会再出现叠加的问题啦!
内容的提问来源于stack exchange,提问作者Mehran

