package org.emdev.ui.preference; import android.annotation.TargetApi; import android.content.Context; import android.preference.SwitchPreference; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.Checkable; import android.widget.CompoundButton; @TargetApi(15) public class SwitchPreferenceEx extends SwitchPreference { private final Listener mListener = new Listener(); private class Listener implements CompoundButton.OnCheckedChangeListener { @Override public void onCheckedChanged(final CompoundButton buttonView, final 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; } SwitchPreferenceEx.this.setChecked(isChecked); } } public SwitchPreferenceEx(final Context context) { super(context); } public SwitchPreferenceEx(final Context context, final AttributeSet attrs) { super(context, attrs); } public SwitchPreferenceEx(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); } @Override protected void onBindView(final View view) { final Checkable cview = getCheckableView(view); if (cview instanceof CompoundButton) { final CompoundButton btn = (CompoundButton) cview; btn.setOnCheckedChangeListener(mListener); } super.onBindView(view); } protected Checkable getCheckableView(final View view) { if (view instanceof Checkable) { return (Checkable) view; } else if (view instanceof ViewGroup) { final ViewGroup group = (ViewGroup) view; for (int i = 0; i < group.getChildCount(); i++) { final View v = group.getChildAt(i); if (v instanceof Checkable) { return (Checkable) v; } } } return null; } }