为textview设置selector

一,源码分析

我们在项目中会经常用到selector以实现点击时状态的改变效果,但是在textview和relativelayout中却不能把背景设置为selector,只能在setonclicklisterner中设置背景图片,这是什么原因呢,我们来看一下源码就可以知道了


public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
public void setClickable(boolean clickable) {
setFlags(clickable ? CLICKABLE : 0, CLICKABLE);
}

通过源码setOnClickListener方法中可以看出,首先是要对textview的clickable属性判断是否为true,如果为true,就setFlags(),在回调ontouchevent方法时

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:
    。。。。
               }


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

二,常见错误







默认的drawable不能写在第一个item,不然下面的item会失去作用,正确写法







在用颜色值来设置背景的时候也经常会出现错误,错误写法






正确写法






你可能感兴趣的:(为textview设置selector)