一,源码分析
我们在项目中会经常用到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>