421

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

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

4

13 に答える 13

883

これを試しましたか?

myButton.setEnabled(false); 

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

于 2010-12-08T07:08:07.160 に答える
42

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

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

同じボタンを有効にしたい場合は、

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
于 2012-11-30T13:58:38.143 に答える
29

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" />
于 2013-09-11T16:18:01.727 に答える
10

私の場合、

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

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

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

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

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
于 2012-12-14T15:12:20.723 に答える
6

Kotlin を使えば、

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = true
于 2020-03-02T18:12:01.790 に答える
4

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

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 ビュー パラメーターは発生しないはずです。これはアサーション エラーです。たとえば、その間に View オブジェクト クラスが破棄された場合に発生する可能性があります ( 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)  
于 2015-06-29T14:32:00.903 に答える
4

ボタンを無効にする必要がある場合は、このコード行を追加します。

Button button = findViewById(R.id.button)
button.setEnabled(false);

ボタンを有効にして、この行を追加するだけです

 button.setEnabled(true);

ハッピーコーディング:D

于 2020-12-14T10:51:30.727 に答える
3

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

        }
    });
}
于 2014-10-01T09:29:54.103 に答える