次へと前への 2 つのボタンを含むレイアウトを作成しました。ボタンの間に、いくつかの動的ビューを生成しています。そのため、アプリケーションを最初に起動するときは、以前のビューがないため、「前へ」ボタンを無効にしたいと考えています。また、表示するビューがこれ以上ない場合は、[次へ] ボタンを無効にしたいと考えています。ボタンを無効にする方法はありますか?
13 に答える
これを試しましたか?
myButton.setEnabled(false);
更新: グウェンに感謝します。android:clickable
ボタンがクリック可能かどうかを決定するために XML レイアウトで設定できることをほとんど忘れていました。
アクティビティに1行のコードを書くだけです
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);
同じボタンを有効にしたい場合は、
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
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" />
私の場合、
myButton.setEnabled(false);
myButton.setEnabled(true);
正常に機能しており、ボタンを有効または無効にしています。ただし、ボタンの状態が無効になると、クリック可能になりますが、再び有効な状態に戻ることはありません。描画可能な状態を無効にして更新しようとしましたが、うまくいきませんでした。
myButton.invalidate();
myButton.refreshDrawableState();
あなたまたは誰かが同様の問題を抱えている場合、私にとってうまくいくのは、背景のドローアブルを再度設定することです。あらゆる API レベルで動作します。
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
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
パラメータの代わりに変数を使用するリスナーの間違った方法!!!
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)
ボタンを無効にする必要がある場合は、このコード行を追加します。
Button button = findViewById(R.id.button)
button.setEnabled(false);
ボタンを有効にして、この行を追加するだけです
button.setEnabled(true);
ハッピーコーディング:D
最初に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);
}
});
}