SwitchPreference响应点击事件

问题背景

需要响应SwitchPreference(CheckBoxPreference的升级版)的点击事件,但是在点击之后,checkbox先变化,然后再弹出我们需要的流程。这个显然跟用户体验有出入了。
用户一般假设,当我们设置完毕之后,这个checkbox状态才会改变。

初始方案

在onPreferenceClick里面对点击的Preference的key进行判断,并进入我们弹出的新流程。这个会产生上面所说的问题,即checkbox会在我们新流程弹出之前就改变了。

解决流程

查看Preference代码

因为所有的基本流程都是在Preference里面定义好了,不同的Preference只是在UI或者独有的状态改变上自定义而已。所以Preference流程是关键,重要函数是performClick。

//简化如下
public void performClick(){
    onClick();
    if(mOnClickListener != null && mOnClickListener.onPreferenceClick(this)){return;}
}

注意调用顺序,先调用onClick,后调用onPreferenceClick函数。
这个onClick函数类似一个占位函数了。我们看看SwitchPreference里面该函数的定义。

查看SwitchPreference源码

其实需要查看的是它的基类TwoStatePreference。

//TwoStatePreference.java
protected void onClick(){
    super.onClick();
    final boolean newValue = !isChecked();
    if(callChangedListener(newValue)){
        setChecked(newValue);
    }
}

其实这个callChangedListener函数是在Preference里面定义的,如下:

protected boolean callChangeListener(Object newValue) {
    return mOnChangeListener == null ? true : mOnChangeListener.onPreferenceChange(this, newValue);
}

解决方法

所以,可以知道实际上先调用onPreferenceChange函数,然后才设置checkbox的状态,最后才会调用onPreferenceClick。
所以如果要在checkbox状态改变之前进行操作,必须在onPreferenceChange函数中进行处理。如果返回false,那么就不会改变这个checkbox的状态啦。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值