SwitchPreference Callback behaviour change in lollipop

我的梦境 提交于 2019-12-06 06:06:51

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.

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!