Allow clicks on the custom widget in CheckBoxPreference
Most of this was copied verbatim from SwitchPreferenceCompat.
When using a custom widgetLayout, a listener needs to be attached to
listen for changes to the checked state, so that this can be passed
into the preference system.
Change-Id: Ieabdfd76d82f8bfd7f313613e25766cea8c3b65b
diff --git a/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java b/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
index 61eb13c..bd85c35 100644
--- a/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
+++ b/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
@@ -23,6 +23,7 @@
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Checkable;
+import android.widget.CompoundButton;
/**
* A {@link Preference} that provides checkbox widget
@@ -35,6 +36,20 @@
* @attr ref android.R.styleable#CheckBoxPreference_disableDependentsState
*/
public class CheckBoxPreference extends TwoStatePreference {
+ private final Listener mListener = new Listener();
+
+ private class Listener implements CompoundButton.OnCheckedChangeListener {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (!callChangeListener(isChecked)) {
+ // Listener didn't like it, change it back.
+ // CompoundButton will make sure we don't recurse.
+ buttonView.setChecked(!isChecked);
+ return;
+ }
+ CheckBoxPreference.this.setChecked(isChecked);
+ }
+ }
public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
@@ -104,8 +119,14 @@
}
private void syncCheckboxView(View view) {
+ if (view instanceof CompoundButton) {
+ ((CompoundButton) view).setOnCheckedChangeListener(null);
+ }
if (view instanceof Checkable) {
((Checkable) view).setChecked(mChecked);
}
+ if (view instanceof CompoundButton) {
+ ((CompoundButton) view).setOnCheckedChangeListener(mListener);
+ }
}
}