使用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>