button-xml 中android:clickable="false" 屬性


今天在做項目的時候,遇到了一個問題,就是需要把一個常按監聽事件,加到一個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)

方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM