Android 5.x SwitchPreference 的行为与 Android 4.x 中的不同

Android 5.x SwitchPreference is not behaving the same as in Android 4.x

我有一个使用 SwitchPreference 的代码,它曾经与 Android 4.x 一起使用,但是自从我将我的设备更新到 Android 5.0.1 后它不再有效。

我有一个简单的 SwitchPreference,它在左侧显示标题,在右侧显示 ON/OFF 开关。

    <SwitchPreference
        android:key="myPref"            
        android:selectable="true"
        android:title="Title" 
        android:fragment="com.myApp.DeviceMonitorPrefsActivity"            
        android:switchTextOn="ON"
        android:switchTextOff="OFF"/>

在首选项Activity 上,当我点击这个 SwitchPreference 控制。

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) 
    {
        if(preference instanceof SwitchPreference){
            // My Action
        }
    }

在Android 4.4.4中,这个Action过去只有在我按下这个控件(标题)的左边时才会执行,但是当我改变开关状态时不会执行。

现在使用 Android 5.0.1,即使我更改开关状态也会调用 onPreferenceTreeClick(),但我没有找到区分这两种情况的方法。

它是 Android 5.0.1 中的错误还是有办法使它正常工作?

此处找到的解决方法似乎有效: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

这是适用于我的案例的实现:

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);
      }
  }

}

然后你只需要使用你自己的 "MySwitchPreference" 直接进入 SwitchPreference。