package de.theknut.xposedgelsettings.ui.preferences; import android.content.Context; import android.preference.SwitchPreference; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.Switch; import de.theknut.xposedgelsettings.ui.CommonUI; /** * * @author theknut * C'mon Google, really? * https://code.google.com/p/android/issues/detail?id=26194 */ public class CustomSwitchPreference extends SwitchPreference { /** * Construct a new SwitchPreference with the given style options. * * @param context The Context that will style this preference * @param attrs Style attributes that differ from the default * @param defStyle Theme attribute defining the default style options */ public CustomSwitchPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * Construct a new SwitchPreference with the given style options. * * @param context The Context that will style this preference * @param attrs Style attributes that differ from the default */ public CustomSwitchPreference(Context context, AttributeSet attrs) { super(context, attrs); } /** * Construct a new SwitchPreference with default style options. * * @param context The Context that will style this preference */ public CustomSwitchPreference(Context context) { super(context, null); } @Override protected void onBindView(View view) { // Clean listener before invoke SwitchPreference.onBindView ViewGroup viewGroup = (ViewGroup) view; clearListenerInViewGroup(viewGroup); super.onBindView(view); CommonUI.setCustomStyle(view, true, true); } /** * Clear listener in Switch for specify ViewGroup. * * @param viewGroup The ViewGroup that will need to clear the listener. */ private void clearListenerInViewGroup(ViewGroup viewGroup) { if (null == viewGroup) { return; } int count = viewGroup.getChildCount(); for(int n = 0; n < count; ++n) { View childView = viewGroup.getChildAt(n); if(childView instanceof Switch) { final Switch switchView = (Switch) childView; switchView.setOnCheckedChangeListener(null); return; } else if (childView instanceof ViewGroup){ ViewGroup childGroup = (ViewGroup)childView; clearListenerInViewGroup(childGroup); } } } }