2

enter image description hereSwitchPreference Ответный изменение поведения в леденец

В нашем проекте мы используем SwitchPreference, подобный WiFi settings.user может переключать значение, нажав на кнопку, и пользователь может переключить увидеть больше вариантов, нажав на название.

Но это не работает в леденец. Я вижу изменение поведения в леденец.

В KitKat:

Когда пользователь нажимает на кнопку переключения, onPreferenceChanged обратного вызова вызывается, и когда пользователь нажимает на название, onPreferenceClicked называется.

В леденец: нажатии на кнопку переключения или название onPreferenceClicked называется всегда и после этого onPreferenceChanged называется. Как я могу получить такое же поведение в леденец? Такое поведение нарушает нашу функциональность.

ответ

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 напрямую.

+0

не знаю почему, но setClickable не работает для меня. Он работает на вас? Я добавил свое обходное решение, которое я использовал. – Vivart

+0

Видимо, да, код, который я там поставил, решил проблему для меня. –

0

В качестве обходного пути я создал пользовательский класс SwitchPreference

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

Это выглядит грязным, но работает для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^