2016-04-28 5 views
2

У меня возникла проблема при восстановлении «только что сохраненного» предпочтения. Вот упрощенный сценарий и соответствующий кодAndroid SharedPreference не сохраняется

Фрагмент # 1

private SharedPreferences mPreferences 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 
    mPreferences = getActivity() 
     .getApplicationContext() 
     .getSharedPreferences(PREF_FILENAME, Context.MODE_PRIVATE); 
    ... 
} 


private void someAction(String value){ 
    mPreferences 
     .edit() 
     .putString(MY_KEY, value) 
     .commit(); 

    mBus.sendEvent(someEvent); // --> 
} 

Фрагмент # 2

private SharedPreferences mPreferences 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 
    mPreferences = getActivity() 
     .getApplicationContext() 
     .getSharedPreferences(PREF_FILENAME, Context.MODE_PRIVATE); 

    mBus.register(this); 
    ... 
} 

private void onSomeEvent(SomeEvent event){ 
    String value = mPreferences.getString(MY_KEY, null); 

    // /////// 
    // value is null !!! whats going on? 
} 

1) Оба фрагмента добавляют к активности по методу Activity.onCreate и фрагментов

2) Фрагмент # 1 хранит SharedPreference и отправляет событие шины в Фрагмент # 2

3) Фрагмент # 2 ловит событие шины, и извлекает то же предпочтение, хранящееся на 2)

4) Значение Предпочтения нуля, предпочтение не хранятся на/данных/данные // shared_preferences/прив-файл. xml

Примечание: не может отправить value на мероприятие автобуса, оно должно пройти через SharedPreference по другим причинам.

Что мне не хватает? Почему нет предпочтительного выбора после сохранения?

Благодаря

+2

Вы уверены, что фиксация SharedPrefs прошла успешно? –

+0

Ну, другие настройки хранятся правильно. Я попытался использовать commit() и apply() и не работал. Я проверю результат операции фиксации на всякий случай. –

+0

Убедитесь, что 'PREF_FILENAME' - это то же самое. –

ответ

0

Может быть, вы смотрите на старой версии общих предпочтений, попробуйте это решение:

private void onSomeEvent(SomeEvent event) { 
    mPreferences = getActivity() .getApplicationContext()  .getSharedPreferences(PREF_FILENAME, Context.MODE_PRIVATE); 
    String value = mPreferences.getString(MY_KEY, null); 
} 
+0

Это не имело бы значения. SharedPreferance выбирает любой текущий статус любого значения. Жизнь объектов не имеет значения. –

0

Я хотел бы предложить, чтобы применить контрольную точку только после совершения значения. Когда отладчик доберется туда, перейдите к оценке кнопки выражения и введите mPreference. Он отобразит информацию об объекте. Там вы можете увидеть, сохраняется ли в нем значение.

Выполняйте то же самое перед доступом к значению в Fragment2. См. Значение есть или нет. Если значение отсутствует или изменено на null, некоторый код изменяет значение между ними точно.

Если это не решит вашу проблему, попробуйте интегрироваться с Stetho Отличный инструмент для команды facebook, чтобы проанализировать вашу БД и sharedpreference (и многое другое).

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