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:

一个非常简单的答案:

在OnClickListener上使用,而不是OnCheckedChangeListener

    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);
        }

    });

现在,您只需要 Select 点击事件,而不必担心编程更改.


答复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);
        }
    }
}

复选框仍然可以在XML中声明为相同,但在代码中初始化GUI时使用此选项:

BetterCheckBox myCheckBox;

// later...
myCheckBox = new BetterCheckBox(context,
    (CheckBox) view.findViewById(R.id.my_check_box));

如果要在不触发侦听器的情况下设置从代码选中,请呼叫myCheckBox.silentlySetChecked(someBoolean)而不是setChecked.

Android相关问答推荐

如何在点击按钮时将字符串插入到文本字段中的光标位置?

Android配置设置. gradle不同应用风格

Android Compose Pages 3-一次加载所有页面,无需在LazyColumn中滚动,无需网络调用和内部滚动

如何更新Kotlin中的显示?

在一列中垂直对齐两个框

在androidStudio中,如何使用带有ResolutionStrategy的ResolutionSelector而不是setTargetResolve()?

插入视图模型时,dagger 未命中绑定错误

可以';t将数据插入房间数据库

Android Kotlin - 计费 - 从应用内购买获取productId

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

是什么导致调用 Firebase 服务器?

当父布局的背景为浅色时,Android ProgressBar 背景 colored颜色 变为灰色

如何删除 Jetpack Compose 中按钮的左边框?

具有数据库和升级潜力的移动应用程序开发(Android)供朋友使用

在 MVVM Jetpack Compose 上添加依赖项时出现重复类错误

如何在一个活动中预加载图像然后在另一个活动中加载它们?

无法解析依赖项'com.github.smarteist:autoimageslider:1.4.0-appcompat'

Android 12 通过包管理器中断 APK 安装?

如何使用文件提供程序将视频从一个应用程序共享到另一个应用程序?

MVVM - 这个逻辑的最佳层是什么?