2013-07-15 3 views
3

Любая идея, почему наличие нескольких SwitchPreferences в PreferenceScreen создаст проблему, при которой, если вы выберете любое из полей, это приведет к изменению других полей? Эта проблема возникает при тестировании на Nexus 4 с 4.2.2, но не на Galaxy S3, работающем 4.0.4. Спасибо за любую помощь, которую вы можете предоставить.Android SwitchPreference не работает правильно в 4.2.2

<?xml version="1.0" encoding="utf-8"?> 

<PreferenceCategory android:title="@string/description_photo_preference"> 

    <SwitchPreference 
      android:key="use_gallery" 
      android:title="@string/title_use_gallery_preference" 
      android:summaryOff="@string/summary_dont_use_gallery_as_photo_source" 
      android:summaryOn="@string/summary_use_gallery_as_photo_source" 
      android:defaultValue="true" 
    /> 

    <SwitchPreference 
      android:key="use_camera" 
      android:title="@string/title_use_camera_preference" 
      android:summaryOff="@string/summary_dont_use_camera_as_photo_source" 
      android:summaryOn="@string/summary_use_camera_as_photo_source" 
      android:defaultValue="true" 
    /> 
    <SwitchPreference 
      android:key="show_last_vin" 
      android:title="@string/pref_string" 
      android:summaryOff="@string/pref_display__false" 
      android:summaryOn="@string/pref_display_true" 
      android:defaultValue="true" 
    /> 
</PreferenceCategory> 
<PreferenceCategory android:title="@string/description_photo_quality_settings"> 
    <ListPreference 
     android:key="prefPhotoQuality" 
     android:entries="@array/photo_quality_settings" 
     android:summary="@string/pref_user_photo_quality_settings" 
     android:entryValues="@array/photo_quality_settings_values" 
     android:title="@string/description_photo_quality_settings" /> 
</PreferenceCategory> 

+1

может подтвердить я столкнулся этот вопрос на Nexus 4.2.2 – AAP

+0

я имею то же самое на моем Nexus 7 работает 4.2.2 – Eric

+0

Это является HTC Sensation с Android 4.0 .3, такой же выпуск. – marczellm

ответ

2

Похоже, это известная проблема, как сообщает this SO post.

Существует обходное решение, которое можно найти here.

Вот код обходной путь:

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

    @Override 
    protected void onBindView(View view) { 
     // Clean listener before invoke SwitchPreference.onBindView 
     ViewGroup viewGroup= (ViewGroup)view; 
     clearListenerInViewGroup(viewGroup); 
     super.onBindView(view); 
    } 

    /** 
    * Clear listener in Switch for specify ViewGroup. 
    * 
    * @param viewGroup The ViewGroup that will need to clear the listener. 
    */ 
    private void clearListenerInViewGroup(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.setOnCheckedChangeListener(null); 
       return; 
      } else if (childView instanceof ViewGroup){ 
       ViewGroup childGroup = (ViewGroup)childView; 
       clearListenerInViewGroup(childGroup); 
      } 
     } 
    } 

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