今天在项目中发现我们有一个小细节以前运行好好的视觉效果现在不对了,应该说有一段时间不对了,只是没有关注这一个小细节,刚好今天改代码碰到他,就探究了一下,顺便把解决方案给记录一下。
还原整个过程
这里我们来还原一下整个过程,我们就写一个类似的效果来复现一下整个过程,看看到底是什么原因。
布局
我有如下一个TextView的布局:
<TextView
android:id="@+id/enable_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:text="坑爹啊!"
android:textColor="@color/white"/>
这里就一个TextView, 内容就直接写在这里了,设置的textColor为white,这里white的定义如下: #ffffff。
运行效果
之后我们在项目中开始运行,TextView有一个点击事件,点击后响应一些逻辑,但是当处于某一个时机的时候TextView的状态是disable的,不能被点击的,这时TextView操作如下:
textView.setEnabled(false);
textView.setText("不能操作");
这里设置了TextView为disable,并且设置了一个文案,这里就硬编码了,主要是为了看效果!
坑爹的事情就此发生,运行后文案从白色变成了黑色。这就奇怪了,我并没有设置这个disable的颜色,那这个黑色是从哪儿来的?
当即我又重新创建了一demo,完全的复现了上面的整个逻辑,但是这次效果是正确的?wtf???
当时就懵逼了,看了看源代码,但是只看了后面创建的源码? 发现并没有什么问题,又在想是我两边设置的主题不一致?两边设置为一样的主题后,发现问题还是存在,这就奇怪了。两边代码基本一致,但是效果截然不同。
后来我就想看看不同的主题是否会影响文字颜色,之后我又重新改变了第一工程的主题,发现disable颜色改变了,从白色变成了灰色,这里可以得出一个结论,主题会影响TextView的disable状态的颜色,但是具体是怎么影响的呐?我查看了整个主题关于TextView的属性,并没有设置disable状态的颜色。我就改变了第二个主题的颜色,但是第二个工程改变了主题颜色还是不会变。你他妈在逗我???
看来此路不通,只好又回到第一步,来比较两个工程,除了代码不一致,其他还有什么地方不一样?后来还真发现有不一致的地方,发现两边的所使用的兼容包版本不一致,出问题的使用的 compile ‘com.android.support:appcompat-v7:23.0.0’, 而正确的使用的是 compile ‘com.android.support:appcompat-v7:23.1.1’,那这里就可以明确的认为兼容包里做了不同的操作:
代码探究
那这里我就来分别看看不同版本里面的代码到底做了啥处理。
23.0.0
兼容包里的代码,TextView最终都会走到AppCompatTextView,那我们来看看代码:
public class AppCompatTextView extends TextView {
private AppCompatTextHelper mTextHelper;
public AppCompatTextView(Context context) {
this(context, null);
}
public AppCompatTextView(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.textViewStyle);
}
public AppCompatTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mTextHelper = new AppCompatTextHelper(this);
mTextHelper.loadFromAttributes(attrs, defStyleAttr);
}
@Override
public void setTextAppearance(Context context,