NextとPreviousの2つのボタンを含むレイアウトを作成しました。ボタンの間に私はいくつかの動的ビューを生成しています。それで、私が最初にアプリケーションを起動したとき、私は以前のビューがないので "Previous"ボタンを無効にしたいです。表示するビューがそれ以上ない場合は、[次へ]ボタンも無効にします。ボタンを無効にする方法はありますか。
これを試しましたか?
myButton.setEnabled(false);
更新日:Gwenに感謝します。ボタンがクリック可能かどうかを判断するためにAndroid:clickable
をXMLレイアウトに設定できることをほとんど忘れていました。
あなたのXMLでそれを有効にしたり無効にしたりすることはできません(あなたのレイアウトは実行時に設定されるので)が、アクティビティの開始時に Android:clickable
でクリック可能かどうかを設定できます。
あなたの活動の中で一行のコードを書くだけです。
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" />
はい、<Button Android:enabled="false" />
を使用するだけでXMLで無効にすることができます
私の場合、
myButton.setEnabled(false);
myButton.setEnabled(true);
ボタンは正常に動作しており、ボタンを有効または無効にすることができます。ただし、ボタンの状態が無効になると、クリック可能ではありますが、二度と有効状態に戻ることはありません。描画可能状態を無効にして更新しようとしましたが、うまくいきませんでした。
myButton.invalidate();
myButton.refreshDrawableState();
あなたや他の人が似たような問題を抱えている場合、私にはうまくいくのは背景を再び描画可能にすることです。あらゆるAPIレベルで動作します。
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
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
間違った方法 パラメータの代わりに変数を使用するためのリスナーに!
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)
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);
}
});
}