一锨推,源碼分析
我們在項目中會經常用到selector以實現點擊時狀態(tài)的改變效果,但是在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>