需求背景是,某个提示文本的TextView里面需要用ClickableSpan实现点击能力,但是点击时不能有背景色。
一开始实现完了之后,发现点击时会出现背景色,于是上网检索解决方案,发现是设置TextView的highLightColor为透明就能解决问题。
然后我去xml里面给这个TextView设置上了。
android:textColorHighlight=”#00000000”
但发现运行起来之后,点击了还是有背景色。
感觉非常奇怪,于是又修改了一个写法,改成运行时,使用代码把highLightColor设置成0,这样改动后发现就符合预期了,点击后没有了背景色。
???为什么呢?xml的设置和代码里的设置效果还不一样?
带着这样的疑问,我翻开了TextView的源码(AndroidSDK 26),看到下面这些相关逻辑:
int mHighlightColor = 0x6633B5E5;
public TextView(
Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
//别的不在意的代码
int textHightlight = 0;
textColorHighlight = appearance.getColor(com.android.internal.R.styleable.TextAppearance_textColorHighlight, textColorHighlight);
if (textColorHighlight != 0) {
setHighlightColor(textColorHighlight);
}
//别的不在意的代码
}
@Deprecated
public void setTextAppearance(Context context, @StyleRes int resId) {
final TypedArray ta = context.obtainStyledAttributes(resId, R.styleable.TextAppearance);
final int textColorHighlight = ta.getColor(
R.styleable.TextAppearance_textColorHighlight, 0);
if (textColorHighlight != 0) {
setHighlightColor(textColorHighlight);
}
//别的不在意的代码
}
public void setHighlightColor(@ColorInt int color) {
if (mHighlightColor != color) {
mHighlightColor = color;
invalidate();
}
}
破案了,原来是因为源码中在读取xml进行属性设置时,特判了颜色值不为0才会去进行实际的修改,而透明的颜色值正是0;但在代码中进行设置时,则没有进行逻辑拦截,所以出现了上述的xml的设置和代码里的设置效果还不一样的情形。
由于这个是系统原生控件TextView的源码逻辑,作为应用开发者并不能修改这个的源码,所以最终的解决方案只能是在代码里设置这个配置项为透明来实现用户点击时无背景色的效果。
aTextView.setHighlightColor(Color.TRANSPARENT);