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

Другие вопросы по тегам