如何区分 Switch,Checkbox 值是由用户更改还是以编程方式(包括通过保留)更改?

2024-01-24

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

    });

现在,您只需获取点击事件,而不必担心编程更改。


答案1:

我创建了一个包装类(请参阅装饰模式),它以封装的方式处理这个问题:

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

如果您想在代码中设置检查而不触发侦听器,请调用myCheckBox.silentlySetChecked(someBoolean)代替setChecked.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何区分 Switch,Checkbox 值是由用户更改还是以编程方式(包括通过保留)更改? 的相关文章

随机推荐

  • MySQL:#126 - 表的密钥文件不正确

    我从 MySQL 查询中收到以下错误 126 Incorrect key file for table 我什至还没有声明该表的键 但我确实有索引 有谁知道可能是什么问题 根据我的经验 每次发生这种情况时 磁盘都已满 EDIT 还值得注意的是
  • asp.net 中的表单身份验证 Cookie 值漏洞

    在asp net中 我可以像往常一样使用表单身份验证登录 复制我们的身份验证cookie值 注销 使用Chrome的 编辑此Cookie 插件将cookie人工添加到客户端 刷新 匿名 登陆页面嘿 很快我又登录了 这似乎是一个漏洞 有没有办
  • 计算垂直于直线的点

    我有一条由 x1 y1 x2 y2 指定的线 L 并想要计算 该点的坐标为 位于与 L 的一半长度相交的法线上 距 L 一定距离 D 例子 如果直线是 x1 a x2 a 水平 则 计算出的点将为 x2 x1 2 D 如果直线是 a y1
  • Define 是未定义的 Javascript 节点

    我正在尝试使用 Node 运行 Javascript 文件 以将博客更新发布到 Tumblr 到目前为止 在我的 main js 文件中 我有以下内容 Tumblr Information var tumblr require vendor
  • 由于图形 API 不再可用,有什么方法可以通过 API 创建 facebook 事件

    我想使用 API 创建 Facebook 事件 我了解到 Graph API 不再可用于发布事件 我还尝试了 Javascript SDK 和 PHP SDK 但收到相同的错误消息 有没有办法通过 Javascript API 创建 Fac
  • 将嵌套 XML 绑定到 CheckboxList

    我有一个嵌套的xml包含菜单和子菜单的文件 我需要在页面加载时将其绑定到 asp net CheckBox 控件 我正在尝试使用下面的 C 代码进行绑定 C DataSet ds new DataSet try Reading the da
  • 当设备方向改变时,UIWebview 中出现黑条

    我有一个 UIWebView 正在加载到另一个视图上 旋转时 纵向或横向的一切看起来都很好 但是当我处于纵向时 当我从纵向旋转到横向时 我通过捏或双击稍微放大 视图不会完全填充使用 uiwebview 右侧大约有 10 个像素变黑 如该屏幕
  • 使用 JavaScript 通过 websocket 进行视频流传输

    最快的直播方式是什么live使用 JavaScript 制作视频 TCP 上的 WebSockets 是否是足够快的协议来传输 30fps 的视频 TCP 上的 WebSockets 是否是足够快的协议来传输 30fps 的视频 是的 是的
  • TYPO3 扩展生成器多个图像上传不起作用

    我的目标是使用 TYPO3 7 6 2 版本中的扩展生成器创建扩展 我从扩展构建器文档创建了类别产品扩展 除了上传单个图像之外 它工作得很好 但我必须创建将多个图像添加到单个产品并在前端显示图像轮播的功能 但扩展生成器不适用于文件上传 我是
  • 组合连续原子变量的存储/加载

    参考 稍微过时的 paper http www open std org JTC1 SC22 WG21 docs papers 2007 n2338 html作者 Hans Boehm 在 原子操作 下 它提到内存模型 当时提出 不会阻止优
  • 使用 Swift 强制 NSLocalizedString 使用特定语言

    通过 swift 我如何强制我的应用程序从特定的 Localized strings 读取数据 我在实例化 ViewController 之前将其放入 didFinishLaunchingWithOptions 中 但它仍然以英语显示应用程
  • 斯威夫特3;范围“超出范围”

    我刚刚将 Xcode 更新到 8 0 beta 2 和 swift 3 0 从 swift 2 3 更新后 我遇到了很多错误 我有一个字符串扩展 它将 self 字符串中的范围转换为 NSRange extension String fun
  • 为什么我应该用 c++ 而不是 c 设置插件接口

    由于我的previous https stackoverflow com questions 1054697 why isnt my new operator called 问题 https stackoverflow com questi
  • C# 将图像从 PowerPoint 复制到 Word

    我需要一个应用程序将文本和图像从 PowerPoint 复制到 Word 我使用这个库 Microsoft Office Interop PowerPoint 和 Microsoft Office Interop Word 文本很容易传输
  • Android 不同屏幕尺寸的布局

    我正在为 Android 应用程序的布局而苦苦挣扎 我为不同的屏幕尺寸定义了不同的布局 当前的布局目录结构是这样的 layout 布局土地 小布局 布局 xlarge 布局 xlarge 土地 Problem 主要布局目录文件正在显示3 7
  • 联系表格 Laravel 4

    我是 Laravel 4 的菜鸟 联系表单给我带来了一些麻烦 发现了一些东西 全部都使用控制器 但我只需要在路线中使用它 如何创建简单的联系表单 姓名 电子邮件和消息 的路由以将数据发送到管理员电子邮箱 Cheers 这是一种仅使用您的路由
  • 使用 Google 脚本删除电子表格中的空白行

    Spreadsheet 1 Spreadsheet 1 中存在的数据 Name apple android windows linux Germany 3 4 6 7 America 4 1 6 2 Sweden 1 6 1 6 Paris
  • 在C中将字符数字转换为相应的整数

    C语言中有没有办法将字符转换为整数 例如 从 5 to 5 根据其他回复 这很好 char c 5 int x c 0 另外 为了进行错误检查 您可能希望首先检查 isdigit c 是否为 true 请注意 您不能完全便携地对字母执行相同
  • 迭代除 x item 之外的字典

    我有一个这种格式的字典 d data key 1 value 1 key 2 value 2 key 3 value 3 key x value x key n value n 我必须迭代它的项目 for key value in colu
  • 如何区分 Switch,Checkbox 值是由用户更改还是以编程方式(包括通过保留)更改?

    setOnCheckedChangeListener new OnCheckedChangeListener Override public void onCheckedChanged CompoundButton buttonView b