今天在做項目的時候,遇到了一個問題,就是需要把一個常按監聽事件,加到一個linearlayout中,但是,這個linearlayout中有其他的button、textview等控件,這樣就導致當我們常按textview的時候,觸發的是textview等子控件的常按事件。今天我們討論的並不是如何解決這個問題,而是在解決這個問題的過程中,我遇到的android:clickable 跟 android:longClickable 這兩個xml屬性。
先看這兩個屬性在xml中的用法
<Button android:id="@+id/bt0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ff0000" android:clickable="false" android:longClickable="false" android:text="long fasle" />
這兩個屬性有什么意義呢,我們看Button 中對這兩個屬性的處理
case com.android.internal.R.styleable.View_clickable: clickable = a.getBoolean(attr, clickable); break; case com.android.internal.R.styleable.View_longClickable: longClickable = a.getBoolean(attr, longClickable); break; } } a.recycle(); setFocusable(focusable); setClickable(clickable); setLongClickable(longClickable);
我們很明白,它其實就是setClick 跟 setLongClick方法xml中的使用。
那么問題就來了。在代碼里設置了上面兩個屬性為false,但當我在代碼中給這這個按鈕設置點擊事件的時候,這兩個點擊事件仍然可以觸發,而且似乎沒有影響。后來我發現了問題所在。我們看一下
setOnClickListener 方法中到底做了什么事情
public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; } public void setOnLongClickListener(OnLongClickListener l) { if (!isLongClickable()) { setLongClickable(true); } getListenerInfo().mOnLongClickListener = l; }
我們很清除就知道了,之所以這兩個屬性設置沒有效果,是因為,當我們給一個控件添加點擊事件的時候,它們會重新把這個控件的clickable 屬性進行設置。所以,如果我們想要禁掉一個控件的點擊事件,我們必須是在點擊事件以后使用
setLongClickable(false); setClickable(false)
方法