[解決済み] SwitchやCheckboxの値が、ユーザーによって変更されたのか、プログラムによって変更されたのか(リテンションを含む)を区別するにはどうすればよいですか?
2022-08-23 09:41:50
質問
setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// How to check whether the checkbox/switch has been checked
// by user or it has been checked programatically ?
if (isNotSetByUser())
return;
handleSetbyUser();
}
});
メソッドの実装方法
isNotSetByUser()
?
どのように解決するのですか?
回答2:
とてもシンプルな答えです。
OnCheckedChangeListenerの代わりにOnClickListenerで使用します。
someCheckBox.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// you might keep a reference to the CheckBox to avoid this class cast
boolean checked = ((CheckBox)v).isChecked();
setSomeBoolean(checked);
}
});
これでクリックイベントだけを拾って、プログラム的な変更を気にする必要がなくなりました。
回答1:
この問題をカプセル化された方法で処理するラッパークラスを作成しました(Decoratorパターンを参照してください)。
public class BetterCheckBox extends CheckBox {
private CompoundButton.OnCheckedChangeListener myListener = null;
private CheckBox myCheckBox;
public BetterCheckBox(Context context) {
super(context);
}
public BetterCheckBox(Context context, CheckBox checkBox) {
this(context);
this.myCheckBox = checkBox;
}
// assorted constructors here...
@Override
public void setOnCheckedChangeListener(
CompoundButton.OnCheckedChangeListener listener){
if(listener != null) {
this.myListener = listener;
}
myCheckBox.setOnCheckedChangeListener(listener);
}
public void silentlySetChecked(boolean checked){
toggleListener(false);
myCheckBox.setChecked(checked);
toggleListener(true);
}
private void toggleListener(boolean on){
if(on) {
this.setOnCheckedChangeListener(myListener);
}
else {
this.setOnCheckedChangeListener(null);
}
}
}
CheckBoxはXMLでも同じように宣言できますが、コードでGUIを初期化するときにこれを使います。
BetterCheckBox myCheckBox;
// later...
myCheckBox = new BetterCheckBox(context,
(CheckBox) view.findViewById(R.id.my_check_box));
リスナーをトリガーせずにコードから checked を設定したい場合は
myCheckBox.silentlySetChecked(someBoolean)
の代わりに
setChecked
.
関連
-
[解決済み] グリッドレイアウトにおけるフリングジェスチャーの検出
-
[解決済み] FragmentのsetRetainInstance(boolean)を理解する。
-
[解決済み】jQueryでチェックボックスがチェックされているかどうかを確認するにはどうすればよいですか?
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。
-
[解決済み] 「KotlinとAndroidで「パラメータTを推測するのに十分な情報がありません。
-
[解決済み] AppCompat-v7 21でアクションバー/ツールバーにアイコンを表示する。
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] EditTextの右側のDrawableにonClickListenerを設定する [重複] [重複
-
[解決済み] PendingIntentの "requestCode "は何に使うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] チェックボックスの値をonCheckChangedをトリガーにせずに変更する
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] AndroidでラジオボタンにOnClickListenerを設定するには?
-
[解決済み] Androidでマイナスマージンを使用するのは悪いことですか?
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] APKが署名済みかデバッグビルドかを確認するには?
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] FragmentPagerAdapterのgetItemが呼び出されない
-
[解決済み] グリッドビューの高さが削減される