Android 5.x SwitchPreference работает не так, как в Android 4.x
У меня есть код, использующий SwitchPreference
это раньше работало с Android 4.x, но больше не работает, так как я обновил свое устройство до Android 5.0.1.
У меня простой SwitchPreference
который отображает заголовок слева и переключатель ВКЛ / ВЫКЛ справа.
<SwitchPreference
android:key="myPref"
android:selectable="true"
android:title="Title"
android:fragment="com.myApp.DeviceMonitorPrefsActivity"
android:switchTextOn="ON"
android:switchTextOff="OFF"/>
На PreferenceActivity я перебил onPreferenceTreeClick()
выполнить действие (запуск настройки действия в моем случае), когда я нажимаю на заголовок этого SwitchPreference
контроль.
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
{
if(preference instanceof SwitchPreference){
// My Action
}
}
В Android 4.4.4 это действие выполнялось только тогда, когда я нажимал слева от этого элемента управления (заголовок), но не когда менял состояние переключателя.
Теперь в Android 5.0.1 onPreferenceTreeClick() вызывается, даже когда я меняю состояние переключателя, и я не нашел способа разграничить два случая.
Это ошибка в Android 5.0.1 или есть способ сделать это чисто?
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.