2010-12-08 182 views
276

我已經創建了一個包含兩個按鈕Next和Previous的佈局。在按鈕之間,我正在生成一些動態視圖。所以當我第一次啓動應用程序時,我想禁用「Previous」按鈕,因爲不會有任何以前的視圖。我還想在沒有更多視圖可顯示時禁用「下一步」按鈕。無論如何禁用按鈕?如何禁用Android按鈕?

screen shot of sample layout

回答

616

你試過這個嗎?

myButton.setEnabled(false); 

更新:感謝Gwen。幾乎忘了可以在您的XML佈局中設置android:clickable以確定按鈕是否可點擊。

+17

沒有等效的XML :-( – Blundell 2011-06-09 19:31:25

+47

相當於android:在xml中啓用。 – Namratha 2013-02-26 09:35:53

+1

你在哪裏找到這個文檔?你能在這裏鏈接嗎? – Varun 2013-02-27 04:13:46

41

您無法在XML中啓用它或禁用它(因爲您的佈局是在運行時設置的),但您可以設置它是否可在啓動android:clickable的活動時單擊。

+0

5年的Android經驗,我現在就瞭解這個! :/ – Sagar 2017-09-10 17:50:13

26

你只寫一行代碼在活動

Button btn = (Button) findViewById(R.id.button1); 
btn.setEnabled(false); 

如果要啓用相同的按鈕只寫

Button btn = (Button) findViewById(R.id.button1); 
btn.setEnabled(true); 
6

在我的情況下,

myButton.setEnabled(false); 
myButton.setEnabled(true); 

工作正常,它是啓用和禁用按鈕,因爲它應該。但是,一旦按鈕狀態變爲禁用狀態,它將永遠不會再次回到啓用狀態,儘管它是可點擊的。我嘗試無效並刷新可繪製狀態,但沒有運氣。

myButton.invalidate(); 
myButton.refreshDrawableState(); 

如果您或任何人有類似的問題,我的作品是設置可再次繪製背景。適用於任何API級別。

myButton.setEnabled(true); 
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable)); 
20

在Java中,一旦你有按鈕的參考:

Button button = (Button) findviewById(R.id.button); 

要啓用/禁用按鈕,您可以使用:

button.setEnabled(false); 
button.setEnabled(true); 

或者:

button.setClickable(false); 
button.setClickable(true); 

由於您想禁用t按鈕他開始,可以使用button.setEnabled(false); onCreate方法中的。 否則,XML,你可以直接使用:

android:clickable = "false" 

所以:

<Button 
     android:id="@+id/button" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:text="@string/button_text" 
     android:clickable = "false" /> 
1

首先在XML使按鈕android:clickable="false"

<Button 
     android:id="@+id/btn_send" 
     android:clickable="false"/> 

然後在你的代碼,裏面oncreate()方法設置按鈕屬性爲

btn.setClickable(true); 

那麼按鈕內點擊更改代碼爲

btn.setClickable(false); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    btnSend = (Button) findViewById(R.id.btn_send); 
    btnSend.setClickable(true); 
    btnSend.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      btnSend.setClickable(false); 

     } 
    }); 
} 
7

是它可以在XML 被禁用只是用 <Button android:enabled="false" />

1

錯誤的方式 IN監聽器,參數,而不是用變量!

btnSend.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     btnSend.setClickable(false); 

    } 
}); 

RIGHT WAY:

btnSend.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     /** check given view by assertion or cast as u wish */ 
     if(v instance of Button) { 

      /** cast */ 
      Button button = (Button) v; 

      /** we can perform some check up */ 
      if(button.getId() == EXPECTED_ID) { 

       /** disable view */ 
       button.setEnabled(false)    
       button.setClickable(false); 
      } 

     } else { 

      /** you can for example find desired view by root view */ 
      Button bt = (Button) v.getRootView().findViewById(R.id.btId); 

      /*check for button */ 
      if(bt!=null) { 

       /** disable button view */ 
       ... 
      } else { 
       /** according to @jeroen-bollen remark 
        * we made assumption that we expected a view 
        * of type button here in other any case 
        */ 
        throw new IllegalArgumentException("Wrong argument: " + 
         "View passed to method is not a Button type!"); 
      } 
      } 
     } 
    }); 

編輯: 在答覆@ JEROEN-博倫

View.OnClickListener 

爲回調接口定義要時調用點擊一個視圖。

方法定義

void onClick(View v); 

當視圖點擊View類對象進行回調方法的onClick()發送的參數本身,因此,如果它確實是不應該出現空視圖參數一個斷言錯誤它可能發生,例如,當查看對象類同時被銷燬(例如由GC收集)或方法由於被破解而被篡改時

很少約的instanceof &空

JLS/15.20.2。類型比較操作的instanceof

在運行時,如果RelationalExpression的值不爲空 和參考可強制轉換爲引用類型 不提高一個ClassCastException instanceof運算符的結果爲真 。

否則結果是錯誤的。從筆者

如果U問爲什麼


三個字?

主要是爲了避免NullPointerException異常

多一點的代碼將保存在以後的bug跟蹤時間在你的代碼&減少abnomalies的發生。

考慮下面的例子:

View.OnClickListener listener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     btnSend.setClickable(false); 

    } 
}); 

btnSend.setOnClickListener(listener) 
btnCancel.setOnClickListener(listener) 
0

在科特林,如果你指的按鈕來查看與ID,然後,啓用/禁用按鈕像

layout.xml

<Button 
    android:id="@+id/btn_start" 
    android:layout_width="100dp" 
    android:layout_height="50dp" 
    android:text="@string/start" 
    android:layout_alignParentBottom="true"/> 

activity.kt

btn_start.isEnabled = true //to enable button 
    btn_start.isEnabled = false //to disable button