大家好,又见面了,我是你们的朋友全栈君。
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账号...