谈谈CompoundButton的OnCheckedChangeListener

谈谈CompoundButton的OnCheckedChangeListenerCompoundButton相信大家都很熟悉了。OnCheckedChangeListener相信大家也很熟悉。不过不知道大家有没有碰到类似的问题:在某个CompoundButton.OnCheckedChangeListener中请求网络接口。在其他一些地方,例如onCreate/onCreateView/setUserVisableHint等等方法中,从另一个接口取得数据,

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

CompoundButton相信大家都很熟悉了。

OnCheckedChangeListener相信大家也很熟悉。

不过不知道大家有没有碰到类似的问题:

在某个CompoundButton.OnCheckedChangeListener中请求网络接口。

在其他一些地方,例如onCreate/onCreateView/setUserVisableHint等等方法中,

从另一个接口取得数据,需要将取得的状态重新的给予这个CompoundButton。

然后会发现,每次从接口取得数据,也会调用一次设置数据的接口。

同时,也会发现,某些情况下(尤其是ViewPager中或者ListView/RecyclerView复用的时候),

控件初始化的时候,设置数据的接口也被调用了。并且设置的数据,是上一次的数据。

经过了分析,各种爬坑,最终发现,只要状态改变,不论是屏幕触摸(用户操作)做出的改变,

还是通过各种方法(setChecked/toggle)对其进行改变,都会回调OnCheckedChangeListener。

那么,我们现在的期望是,只有触摸事件才回调OnCheckedChangeListener,怎么办呢?

写一个类,继承自系统自带的CompoundButton。

并且重写方法:setChecked、setOnCheckedChangeListener、toggle

并且重载setChecked。

代码如下:

public class CustomSwitchCompat extends CompoundButton {
    private OnCheckedChangeListener mOnCheckedChangeListener;

    public CustomSwitchCompat(Context context) {
        super(context);
    }

    public CustomSwitchCompat(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomSwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setChecked(boolean checked) {
        setChecked(checked, true);
    }

    public void setChecked(boolean checked, boolean isCallBySelf) {
        if (isCallBySelf)
            setOnCheckedChangeListener(null);
        else
            setOnCheckedChangeListener(mOnCheckedChangeListener);
        super.setChecked(checked);
    }

    @Override
    public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
        mOnCheckedChangeListener = onCheckedChangeListener;
        super.setOnCheckedChangeListener(onCheckedChangeListener);
    }

    @Override
    public void toggle() {
        setChecked(!isChecked(), false);
    }
}

1、为什么需要重写setChecked呢?

为了使所有程序作出的状态改变操作,给重载方法传参。

2、为什么需要重写setOnCheckedChangeListener?

由于此类没有提供getOnCheckedChangeListener,为了获得并保存监听器

3、为什么需要重载setChecked呢?

通过传入的参数进行判定,来操控父类存储的OnCheckedChangeListener。

4、为什么重写toggle呢?

通过源码分析,发现Framework代码中,只被performClick这个方法所调用。因此令其传参给。

当然,也有一个其他的思路,直接不给父类对象setOnCheckedChangeListener。

在本地回调,也可以。


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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133732.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 敏捷开发有哪些模式_软件敏捷开发方法的模式

    敏捷开发有哪些模式_软件敏捷开发方法的模式在信息技术高速发展的今天,有很多的开发任何要求开发人员增量交付,迭代式开发,能够持续集成。很显然传统的瀑布开发模式已经不能满足需要了,于是,敏捷开发这种模式就出现了。接触过敏捷开发的朋友可能会知道,

  • ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口

    ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?1.1描述SFTP(SSHFileTransferProtocol)即安全文件传送协议),是一数据流连接,提供文件访问、传输和管理功能的网络传输协议。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。sftp是基于ssh上实现的,所以严格来说我们是无法来关闭ssh,而只是使用sftp。ssh…

  • 【CEGUI】资源加载流程「建议收藏」

    【CEGUI】资源加载流程「建议收藏」CEGUI资源加载流程主要资源类型Schemescheme资源(包括图像集、字体资源、窗口外观信息、类型映射)等。可以通过“.scheme“”将CEGUI系统所需要的全部资源一次加载。例:TaharezLook.scheme<?xmlversion=”1.0″?> <GUISchemeversion=”5″name=”TaharezLook”> <Imagesetfilename=”TaharezLook.imagese

  • BInder机制总结

    BInder机制总结BInder机制Linux内核的基础知识+进程隔离/虚拟地址空间操作系统当中为了保证进程间互不干扰,设计了进程隔离的技术,避免了一个进程去操作另一个进程的数据。进程隔离用到了虚拟地址空间,不

  • 网站域名没有备案,可以访问嘛?

    网站域名没有备案,可以访问嘛?

  • vue服务器端渲染(SSR)实战

    vue服务器端渲染(SSR)实战

发表回复

您的电子邮箱地址不会被公开。

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