为textview设置selector

一,源码分析

我们在项目中会经常用到selector以实现点击时状态的改变效果,但是在textview和relativelayout中却不能把背景设置为selector,只能在setonclicklisterner中设置背景图片,这是什么原因呢,我们来看一下源码就可以知道了
<pre>
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
public void setClickable(boolean clickable) {
setFlags(clickable ? CLICKABLE : 0, CLICKABLE);
}
</pre>
通过源码setOnClickListener方法中可以看出,首先是要对textview的clickable属性判断是否为true,如果为true,就setFlags(),在回调ontouchevent方法时
<pre>
public boolean onTouchEvent(MotionEvent event) {
。。。。

    if (((viewFlags & CLICKABLE) == CLICKABLE ||
            (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) ||
            (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE) {
        switch (action) {
            case MotionEvent.ACTION_UP:
    。。。。
               }

</pre>
只有加过标志才会进行下面的操作。所以如果想要为textview设置selector,只需要在xml布局中添加clickable属性为true即可。

二,常见错误

<pre>
<selector xmlns:android=”http://schemas.android.com/apk/res/android”>
<item android:drawable=”@color/colorAccent”/>
<item android:state_pressed=”true” android:drawable=”@color/numberPress”/>
<item android:state_focused=”true” android:drawable=”@color/numberPress”/>

</selector>
</pre>
默认的drawable不能写在第一个item,不然下面的item会失去作用,正确写法
<pre>
<?xml version=”1.0″ encoding=”utf-8″?>
<selector xmlns:android=”http://schemas.android.com/apk/res/android”>

<item android:state_pressed="true" android:drawable="@color/numberPress"/>
<item android:state_focused="true" android:drawable="@color/numberPress"/>
<item android:drawable="@color/colorAccent"/>

</selector>
</pre>
在用颜色值来设置背景的时候也经常会出现错误,错误写法
<pre>
<?xml version=”1.0″ encoding=”utf-8″?>
<selector xmlns:android=”http://schemas.android.com/apk/res/android”>
<item android:state_pressed=”true” android:drawable=”#FFFFFF”/>
<item android:state_focused=”true” android:drawable=”#6699FF”/>
</selector>

</pre>
正确写法
<pre>
<?xml version=”1.0″ encoding=”utf-8″?>
<selector xmlns:android=”http://schemas.android.com/apk/res/android”>
<item android:state_pressed=”true” android:drawable=”@color/numberPress”/>
<item android:state_focused=”true” android:drawable=”@color/numberPress”/>
</selector>
</pre>

    原文作者:雨毅
    原文地址: https://www.jianshu.com/p/b03dcd646814
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞