使用CheckBoxPreference的一个坑

1,121 阅读1分钟

使用CheckBoxPreference的坑

最近在使用CheckBoxPreference这个组件时遇到一些小问题,记录一下,方便以后有和我一样的人再次踩坑。

在使用这个组件是发现setOnPreferenceChangeListener这个监听不管用,没反应,只有在点击整个Item的时候才行,如果是点击后面的图标是没有反应的,可以说是系统的一个bug吧。

在查看源码后发现,发现CheckBox根本就没有设置监听事件,所以也就肯定不会监听到了。

怎么修复这个问题了,那就只能继承CheckBoxPreference后,覆盖onBindView方法,获取到checkbox后,自己设置一个setOnPerformCheckedChangeListener事件,具体如下:

public class SettingCheckBoxPreference extends CheckBoxPreference {

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

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

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

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        View checkboxView = view.findViewById(android.R.id.checkbox);
        if (checkboxView != null && checkboxView instanceof SlidingButton) {
            ((SlidingButton) checkboxView).setOnPerformCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    callChangeListener(isChecked);
                    setChecked(isChecked);
                }
            });
        }
    }
}
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/option_about" >

    <com.xxx.view.SettingCheckBoxPreference
        android:key="UserAgreementKey"
        android:title="@string/revoke_title"
        android:summary="@string/revoke_desc">
    </com.xxx.view.SettingCheckBoxPreference>

</PreferenceScreen>