getPreferences всегда возвращает значение по умолчанию
Я создал PreferenceFragment
с двумя логическими предпочтениями. Fragment
работает нормально, а настройки сохраняются, когда приложение закрывается и открывается снова. У меня, однако, возникают проблемы при попытке прочитать эти значения; возвращается только значение по умолчанию. Если я отлажу в getBoolean
метод SharedPreferences
Я вижу, что местный HashMap
имеет размер 0, поэтому возвращается значение по умолчанию, например:
public boolean getBoolean(String key, boolean defValue) {
synchronized (this) {
awaitLoadedLocked();
Boolean v = (Boolean)mMap.get(key); // <-- mMap is of size 0: return defValue
return v != null ? v : defValue;
}
}
Я нахожу это странным, так как значения предпочтений, очевидно, хранятся и загружаются должным образом в PreferenceFragment
, Что мне не хватает?
В Activity.onCreate()
:
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
Рез / XML /preferences.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="mm_preferences_category_recipe_preferences"
android:title="@string/mm_preferences_category_recipe_preferences_title" >
<CheckBoxPreference
android:key="@string/mm_preferences_numbers_as_fractions_key"
android:title="@string/mm_preferences_numbers_as_fractions_title"
android:summary="@string/mm_preferences_numbers_as_fractions_summary"
android:defaultValue="true" />
<CheckBoxPreference
android:key="@string/mm_preferences_comma_as_decimal_separator_key"
android:title="@string/mm_preferences_comma_as_decimal_separator_title"
android:summary="@string/mm_preferences_comma_as_decimal_separator_summary"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>
мой PreferenceFragment
учебный класс:
public class MiasMatPreferencesFragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
Теперь, делая это в любом месте приложения, возвращает только значения по умолчанию (true в обоих случаях), даже если PreferenceFragment
показывает, что значения установлены в false (если так):
boolean foo = getPreferences(Context.MODE_PRIVATE).getBoolean(getString(R.string.mm_preferences_numbers_as_fractions_key), true);
boolean bar = getPreferences(Context.MODE_PRIVATE).getBoolean(getString(R.string.mm_preferences_comma_as_decimal_separator_key), true);
1 ответ
Поработав с этим несколько часов, я выяснил причину, почему это не сработало для меня. Есть несколько SharedPreferences
внутри одного приложения, которое я не осознавал. Это означает, что (1) Activity.getPreferences(int mode)
, (2) Context.getSharedPreferences(String name, int mode)
и (3) PreferenceManager.getDefaultSharedPreferences(Context context)
возвращает разные экземпляры SharedPreferences
,
В моем случае решение было использовать PreferenceManager.getDefaultSharedPreferences(Context context)
, Это потому, что я использую пользовательскую библиотеку для обратной совместимости PreferenceFragment
, Эта библиотека записывает в файл настроек по умолчанию.
Из документов:
PreferenceManager.getDefaultSharedPreferences(Context context)
Получает экземпляр SharedPreferences, который указывает на файл по умолчанию, который используется платформой предпочтений в данном контексте.
Так что это предпочтения для данного Context
или же Activity
в любое время, используя имя файла по умолчанию для предпочтений. Это статический экземпляр PreferenceManager
учебный класс.
Context.getSharedPreferences(String name, int mode)
Получить и сохранить содержимое файла настроек "name", возвращая SharedPreferences, через который вы можете получить и изменить его значения. Только один экземпляр объекта SharedPreferences возвращается любым абонентам с тем же именем, что означает, что они увидят изменения друг друга, как только они будут сделаны.
Используя этот метод, вы можете различать несколько файлов настроек, используя String
аргумент.
Activity.getPreferences(int mode)
Получите объект SharedPreferences для доступа к предпочтениям, которые являются частными для этого действия.
Этот метод вызывает непосредственно к предыдущему, как это: getSharedPreferences(getLocalClassName(), mode)
, Следовательно, он указывает на файл в зависимости от имени Activity
,
Другие связанные вопросы (возможные дубликаты):
Разница между getDefaultSharedPreferences и getSharedPreferences
/questions/46526732/preferencemanagergetdefaultsharedpreferences-protiv-getpreferences