2013-08-06 2 views
2

Я довольно новичок в разработке Android-приложений, поэтому, возможно, я просто делаю простую ошибку новичков, но вот моя проблема: У меня есть 2 простых действия, MainActivity и SettingsActivity. В MainActivity у меня есть кнопка, которая отображает SettingsActivity. В разделе «Параметры настройки» я включаю параметр «Параметры предпочтений» и отображает ButtonBar в нижней части «Активность». В SettingsFragment у меня MultiSelectListPreference определяется следующим образом:MultiSelectListPreference не сохраняет значения?

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 
    <PreferenceCategory 
     android:title="@string/title_schedule_settings"> 

     <MultiSelectListPreference 
      android:key="@string/key_list_schedule" 
      android:title="@string/title_schedule_list" 
      android:dialogTitle="@string/title_schedule_list" 
      android:entries="@array/list_weekdays" 
      android:entryValues="@array/list_weekdays" 
      android:defaultValue="@array/empty_list" 
      android:persistent="true"/> 
    </PreferenceCategory> 

</PreferenceScreen> 

Теперь, когда я выбираю, что предпочтение она показывает мне список всех записей, как определено в массиве, можно выбрать несколько записей, и когда я подтвердить диалог значения фактически хранятся в SharedPreferences под определенным ключом. Но если теперь я снова покажу «Предпочтение», он покажет мне ранее выбранные элементы как выбранные, но значения больше не сохраняются в SharedPreferences, и после некоторого разворачивания я должен был понять, что значения в SharedPreferences, по-видимому, стираются, как только отображается диалог.

Итак, теперь мои вопросы: это нормальное/предполагаемое поведение или это ошибка? И как я могу обойти это? Я уже пытался сделать свою собственную реализацию MultiSelectListPreference и переопределить метод onPrepareDialogBuilder как этот

@Override 
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) 
{ 
    super.onPrepareDialogBuilder(builder); 

    Log.i("mmslp", Arrays.deepToString(PreferenceManager.getDefaultSharedPreferences(getContext()).getStringSet(getKey(), new HashSet<String>()).toArray())); 
    setValues(PreferenceManager.getDefaultSharedPreferences(getContext()).getStringSet(getKey(), new HashSet<String>())); 
} 

, но значения, по-видимому стер уже на данный момент.

ответ

7

Я провел некоторое время вчера на этом, и теперь я убежден, что он не предназначен для этого, но на самом деле сломан - кто-то путает ссылку по указателю и по значению. ;-)

Кажется быть исправлено в более текущих версиях Android (начиная с 4.1), хотя: https://code.google.com/p/android/issues/detail?id=22807

Так я решил сейчас для предыдущих версий Android, чтобы переопределить метод setValues ​​в моем внедрение MultiSelectListPreference и просто копирование значений в новый объект:

@Override 
public void setValues(Set<String> values) { 

    //Workaround for https://code.google.com/p/android/issues/detail?id=22807 
    final Set<String> newValues = new HashSet<String>(); 
    newValues.addAll(values); 
    super.setValues(newValues); 
} 
Смежные вопросы