compoundbutton调用setChecked触发onCheckedChanged的终极解决方案;「建议收藏」

compoundbutton调用setChecked触发onCheckedChanged的终极解决方案;「建议收藏」当我们想要实现了一个简单的有状态切换的控件的时候,我们通常会去实现,CompoundButton来实现我们想要的一个效果,最常见的就是系统的CheckBox,但是在使用的过程中,我们会发现一个问题就是:我们在使用SetChecked的时候,总是会触发,onCheckedChanged这个回掉方法;那么怎么样才能做到不触发这个回掉方法呢?首先我们需要知道为什么会触发这个方法;查看源码如下:pu

大家好,又见面了,我是你们的朋友全栈君。

当我们想要实现了一个简单的有状态切换的控件的时候,我们通常会去实现,CompoundButton来实现我们想要的一个效果,最常见的就是系统的CheckBox,但是在使用的过程中,我们会发现一个问题就是:我们在使用SetChecked的时候,总是会触发,onCheckedChanged这个回掉方法;
那么怎么样才能做到不触发这个回掉方法呢?
首先我们需要知道为什么会触发这个方法;查看源码如下:

public void  setChecked(boolean checked) {
    if (mChecked != checked) {
        mChecked = checked;
        refreshDrawableState();

        // Avoid infinite recursions if setChecked() is called from a listener
        if (mBroadcasting) {
            return;
        }

        mBroadcasting = true;
        if (mOnCheckedChangeListener != null) {
            mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
        }

        if (mOnCheckedChangeWidgetListener != null) {
            mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
        }

        mBroadcasting = false;            
    }
}

我们发现一个问题就是:只要我们设置了监听器,是会始终触发onCheckedChanged里面的回掉方法的,所以这里我们在调用SetChecked的时候不想触发OnCheckedChanged里面的方法的时候,我们在调用之前将这个监听器设置为空,掉用结束后,再次设置监听器;
具体如下:

mCheck.setOnCheckedChangeListener (null);
mCheck.setChecked (false);
mCheck.setOnCheckedChangeListener (mListener);

这样的话,就完美解决了,setChecked触发了onCheckedChanged里面的监听的方法;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136334.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月4日 下午3:00
下一篇 2022年5月4日 下午3:20


相关推荐

  • hadoop生态圈相关技术_hadoop的生态

    hadoop生态圈相关技术_hadoop的生态装完hadoop2.6.0-cdh5.5.2后put命令不好使,并且装完hive后导入本地数据也报错,put命令一直报这个错:hadoop@debian:~$hadoopfs-puthe.tt/aaa17/01/0223:37:52WARNhdfs.DFSClient:DataStreamerExceptionorg.apache.hadoop.ipc.RemoteE

    2025年6月22日
    7
  • SQL 清空表数据的方法

    SQL 清空表数据的方法truncatetabletablenamedeletefromtablenamedelete方法最大的问题,当有标志字段时就有问题一般建議盡可能使用delete去刪除表的字段,它具有選擇性刪除的作用,所以常常deletefromtablenamewhere條件delete和truncate作用其實是一樣的,隻是truncate后面不跟where條件句,它的作用是刪除表中所有的行(記錄)兩者最大的區別就是delete是寫日誌文件的,而truncate則不寫日誌直接刪除

    2022年6月5日
    61
  • 如何修改Tomcat版本[通俗易懂]

    如何修改Tomcat版本[通俗易懂]1.找到tomcat所在位置进入lib目录apache-tomcat-8.0.0\lib2.lib目录下有个catalina.jar用解压缩软件打开(可以先解压再修改版本号再打成jar包这样太麻烦所以直接用解压缩软件打开就行,我用的是winzip)3.打开后在catalina.jar\org\apache\catalin

    2022年8月30日
    6
  • nginx系列之一:nginx入门

    nginx系列之一:nginx入门一、nginx功能介绍Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2+mod_proxy_balancer的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到Apache的近2/3。对proxy和rewrite模块的支持很彻底,还支持mod_fcgi、ssl、vhosts,适合用来做mongrelclust…

    2022年6月2日
    34
  • MySQL数据库:存储过程Procedure

    MySQL数据库:存储过程Procedure

    2021年10月4日
    65
  • C语言实现Socket简单通信

    C语言实现Socket简单通信环境是 linux 不过应该没什么影响 因为只用到了 socket 的基本用法 没有涉及 pthread 等 分为服务器端和客户端 服务器端监听端口发来的请求 收到后向客户端发送一个 HelloWorld 客户机负责发送消息并打印收到的 HelloWorld 服务器步骤 建立 socket 绑定 socket 和地址信息 开启监听 收到请求后发送数据 客户端步骤 建立 socket 连接服务器端 接收并

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号