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的状态啦。

你可能感兴趣的:(Android开发,Android项目)