SwitchPreference Callback behaviour change in lollipop

463 views Asked by At

enter image description here

In our project we are using SwitchPreference similar to wifi settings.user can toggle value by clicking on toggle button and user can see more options by clicking on title.

But this is not working in lollipop. I can see some behaviour change in lollipop.

In kitkat:

When user taps on toggle button, onPreferenceChanged callback is called and when user taps on title, onPreferenceClicked is called.

In lollipop: you tap on toggle button or title onPreferenceClicked is called always and after that onPreferenceChanged is called. How can I get same behaviour in lollipop? This behaviour is breaking our functionality.

2

There are 2 answers

0
Vivart On

As a workaround I have created custom SwitchPreference class

public class CustomSwitchPreference extends SwitchPreference {
public CustomSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

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

public CustomSwitchPreference(Context context) {
    super(context);
}
 @Override
    protected View onCreateView(ViewGroup parent) {
        View view =  super.onCreateView(parent);
 LinearLayout switchView =  (LinearLayout) ((LinearLayout) view).getChildAt(2);
switchView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final boolean newValue = !isChecked();
                if (callChangeListener(newValue)) {
                    setChecked(newValue);
                }
            }
        });
}

It looks dirty but working for me.

2
Thierry Campiche On

I encounter same issue and I found this : https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=172425

After some try, I found how to implement this workaround that work on my case :

public class MySwitchPreference 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 MySwitchPreference(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 MySwitchPreference(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 MySwitchPreference(Context context) {
    super(context, null);
}

@Override
protected void onBindView(View view) {
    ViewGroup viewGroup= (ViewGroup)view;
    setSwitchClickable(viewGroup);
    super.onBindView(view);
}

private void setSwitchClickable(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.setClickable(true);
          return;
      } else if (childView instanceof ViewGroup){
        ViewGroup childGroup = (ViewGroup)childView;
        setSwitchClickable(childGroup);
      }
  }

}

Then you just have to use your own "MySwitchPreference" into SwitchPreference directly.