web-dev-qa-db-ja.com

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

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

screen shot of sample layout

330
Dijo David

これを試しましたか?

myButton.setEnabled(false); 

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

723
Varun

あなたのXMLでそれを有効にしたり無効にしたりすることはできません(あなたのレイアウトは実行時に設定されるので)が、アクティビティの開始時に Android:clickable でクリック可能かどうかを設定できます。

47
Gwen

あなたの活動の中で一行のコードを書くだけです。

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

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

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

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" />
23
Paolo Rovelli

はい、<Button Android:enabled="false" />を使用するだけでXMLで無効にすることができます

19
Mulaffer

私の場合、

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

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

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

あなたや他の人が似たような問題を抱えている場合、私にはうまくいくのは背景を再び描画可能にすることです。あらゆるAPIレベルで動作します。

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

Kotlinでは、Button Viewを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
4
Sackurise

間違った方法 パラメータの代わりに変数を使用するためのリスナーに!

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 

is Interface definition ビューがクリックされたときに呼び出されるコールバックのためのものです。

メソッド定義

void onClick(View v);

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

少しだけ instanceof&null

JLS/15.20.2。型比較演算子instanceof

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

さもなければ結果は偽です


作者からの3つの単語

もしあなたが質問したら?

ほとんどの場合NullPointerExceptionを避けます

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

以下の例を考えてください。

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
2
ceph3us

xmlの最初のボタンをAndroid:clickable="false"にする

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

次に、コードのoncreate()メソッド内でbuttonプロパティを次のように設定します。

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
rajeesh