Android Studio中如何正确获取并比较TextView的背景颜色?
解决两个TextView背景颜色比较的问题
嘿,这问题我之前也踩过坑!你直接比较Drawable对象或者用equals()没效果的原因是:哪怕用的是同一个white.xml资源,系统默认会给每个View创建独立的Drawable实例,所以对象引用肯定不一样,equals()自然也不会返回true。
下面给你两种靠谱的解决方案,根据你的white.xml类型选就行:
方案1:如果white.xml是纯色Shape(最常用场景)
如果你的white.xml是类似这样的纯色背景:
<!-- res/drawable/white.xml --> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FFFFFF" /> </shape>
那可以把Drawable转换成ColorDrawable,直接比较颜色值:
public void getColor(View view) { Drawable bgText1 = findViewById(R.id.text1).getBackground(); Drawable bgText2 = findViewById(R.id.text2).getBackground(); // 先判断背景是否为ColorDrawable类型 if (bgText1 instanceof ColorDrawable && bgText2 instanceof ColorDrawable) { int color1 = ((ColorDrawable) bgText1).getColor(); int color2 = ((ColorDrawable) bgText2).getColor(); if (color1 == color2) { // 颜色相同,执行你的业务逻辑 Toast.makeText(this, "两个TextView背景颜色一致", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "两个TextView背景颜色不同", Toast.LENGTH_SHORT).show(); } } }
方案2:判断是否来自同一个Drawable资源(通用所有Drawable)
如果你的white.xml是带渐变、边框的复杂Shape,或者其他类型的Drawable,那可以比较它们的ConstantState——同一个xml资源生成的Drawable,ConstantState是共享的:
public void getColor(View view) { Drawable bgText1 = findViewById(R.id.text1).getBackground(); Drawable bgText2 = findViewById(R.id.text2).getBackground(); // 通过ConstantState判断是否来自同一个资源 if (bgText1.getConstantState().equals(bgText2.getConstantState())) { // 背景来自同一个drawable资源 Toast.makeText(this, "两个TextView用的是同一个背景资源", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "两个TextView的背景资源不同", Toast.LENGTH_SHORT).show(); } }
两种方案的区别
- 方案1是直接比较颜色值:哪怕两个背景来自不同xml,但颜色相同,也会判定为一致;
- 方案2是比较资源归属:只有当两个背景确实用的是同一个xml资源时,才会判定为一致,更贴合你当前的场景。
内容的提问来源于stack exchange,提问作者Wiji KhaN
相关产品推荐
相关产品推荐

