Androidボタンを無効にする方法は?


371

[次へ]と[前へ]の2つのボタンを含むレイアウトを作成しました。ボタンの間に私はいくつかの動的なビューを生成しています。したがって、最初にアプリケーションを起動するときは、前のビューがないため、[前へ]ボタンを無効にします。表示するビューがなくなった場合は、[次へ]ボタンを無効にしたいと思います。とにかくボタンを無効にする方法はありますか?

サンプルレイアウトのスクリーンショット

回答:


801

やってみましたか?

myButton.setEnabled(false); 

更新:グウェンに感謝します。android:clickableボタンがクリック可能かどうかを判断するためにXMLレイアウトで設定できることをほとんど忘れていました。


66
同等のものはxmlでandroid:enabledです。
Namratha 2013

1
そして、ドキュメントのどこにそれを見つけましたか?ここにリンクできますか?
Varun 2013

4
@Namrathaこれは、ボタンとしてのimageViewではなく、「ボタン」ウィジェットに対してのみ機能します
mehmet

Xamarinでの同等機能:myButton.Enabled = false;
キャメロンフォワード

48

(レイアウトは実行時に設定されるため)XMLで有効または無効にすることはできませんが、を使用してアクティビティの起動時にクリック可能かどうかを設定できますandroid:clickable


4
Androidでの5年の経験と私はこれについて今知ることができます!:/
Sagar

35

アクティビティにコードを1行書くだけです

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

同じボタンを有効にしたいときは、

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

20
それは2行です。これは一つです。((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark、

34
気持ちを理解してみてくださいMatt ..;)
Deepak Sharma '15

30

はい、それをXMLを使用して無効にすることができます:

<Button
android:enabled="false"
/>

2
これがxmlの本当の答えです。クリッカブルをいじるという意味のないことはすべて、ボタンがどのように描画されて無効になっているように見えるかとは関係ありません。
Scott Biggs 2017

1
AS / IDEAのコード補完ではandroid:enabled、入力を開始するときにそれが示唆されないため、これを行うことはできないと人々は思ったと思います。(今日まで)
Kevin Krumwiede

1
私はそれが唯一のコードから、動作していないしようとしたsetEnabled作業である
FindOutIslamNow

23

Javaでは、ボタンの参照を取得したら:

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

ボタンを有効/無効にするには、次のいずれかを使用できます。

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

または:

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

最初からボタンを無効にしたいので、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" />

回答:12月8日10:7にVarun

1
@Poldie:実際、2つの回答を読んだ場合、それらはかなり似ているが等しくないことがわかります。
Paolo Rovelli、2014

9

私の場合、

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

正常に動作しており、ボタンを有効または無効にしています。ただし、ボタンの状態が無効になると、クリック可能ですが、再び有効な状態に戻ることはありません。ドローアブルの状態を無効にして更新しようとしましたが、うまくいきませんでした。

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

あなたや誰かが同様の問題を抱えている場合、私にとってうまくいくのは、背景のドローアブルをもう一度設定することです。どのAPIレベルでも機能します。

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

8

Kotlinでは、ボタンビューを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

2

最初に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);

        }
    });
}

2

リスナーの変数の代わりに変数を使用する方法が間違っています!!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

正しい方法:

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-bollenへの返信

 View.OnClickListener 

あるインターフェイスの定義ビューをクリックしたときに呼び出されるコールバックを。

メソッドの定義

void onClick(View v);

ビューがクリックされると、ViewクラスオブジェクトがonClick()メソッドへのコールバックをパラメーター自体として送信するため、アサーションエラーの場合、nullビューパラメーターは発生しません。 GCによって収集された例)またはハッキングのためにメソッドが改ざんされた

instanceofとnullについて少し

JLS / 15.20.2。型比較演算子instanceof

実行時に、RelationalExpressionの値がnullではなく、ClassCastExceptionを発生させずに参照をReferenceTypeにキャストできる場合、instanceof演算子の結果はtrueです。

それ以外の場合、結果はfalseです。


著者からの3つの言葉

なぜ質問するのですか?

主にNullPointerExceptionを回避する

コードを少し追加するだけで、後でコード内でバグを追跡する時間が節約され、異常の発生が減少します。

次の例を検討してください:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

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

2
else式が呼び出されるときはいつでも、コードにすでにバグが存在しているようです。ボタンを期待していましたが、何かが渡されました。あなたは、必要がある場合に例外をスローvではありませんButton
Jeroen

私が意味したことではありませんが、それでも改善されました。
Jeroen

@JeroenBollen eelaborate please :)わかりました。一貫していないことが1つだけあります。「メソッドに間違ったビューが渡されました」に関する例外メッセージです。
ceph3us 2015

関数自体がnullを受け取った場合、それはすでにバグであり、例外をスローする必要があることを意味しました。
Jeroen 2015

1

Kotlinを使用すると、

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.