[次へ]と[前へ]の2つのボタンを含むレイアウトを作成しました。ボタンの間に私はいくつかの動的なビューを生成しています。したがって、最初にアプリケーションを起動するときは、前のビューがないため、[前へ]ボタンを無効にします。表示するビューがなくなった場合は、[次へ]ボタンを無効にしたいと思います。とにかくボタンを無効にする方法はありますか?
[次へ]と[前へ]の2つのボタンを含むレイアウトを作成しました。ボタンの間に私はいくつかの動的なビューを生成しています。したがって、最初にアプリケーションを起動するときは、前のビューがないため、[前へ]ボタンを無効にします。表示するビューがなくなった場合は、[次へ]ボタンを無効にしたいと思います。とにかくボタンを無効にする方法はありますか?
回答:
やってみましたか?
myButton.setEnabled(false);
更新:グウェンに感謝します。android:clickable
ボタンがクリック可能かどうかを判断するためにXMLレイアウトで設定できることをほとんど忘れていました。
(レイアウトは実行時に設定されるため)XMLで有効または無効にすることはできませんが、を使用してアクティビティの起動時にクリック可能かどうかを設定できますandroid:clickable
。
アクティビティにコードを1行書くだけです
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);
同じボタンを有効にしたいときは、
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
((Button)findViewById(R.id.mybutton)).setEnabled(false);
はい、それをXMLを使用して無効にすることができます:
<Button
android:enabled="false"
/>
android:enabled
、入力を開始するときにそれが示唆されないため、これを行うことはできないと人々は思ったと思います。(今日まで)
setEnabled
作業である
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では、ボタンビューを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
最初に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);
}
});
}
リスナーの変数の代わりに変数を使用する方法が間違っています!!!
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)
v
ではありませんButton
。
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