Как привязать предпочтение к конкретным SharedPreferences?

#android #persistence #sharedpreferences #preference

#Android #настойчивость #sharedpreferences #предпочтение #постоянство

Вопрос:

Я работаю над реализацией предпочтений для нашего приложения. Я знаю, как отображать пользовательский интерфейс настроек и как читать / записывать значения с помощью SharedPreferences . В нашем приложении мне нужно обрабатывать два набора настроек, и я хотел бы спросить об этой проблеме, в частности, об одном комментарии в документах Android.

Документация для Preference.getSharedPreferences() содержит следующий комментарий под Return values разделом:

Returns SharedPreferences, в которых это предпочтение считывает свои значения, или null, если оно не привязано к иерархии предпочтений.

Я хотел бы спросить, как можно привязать a SharedPreferences к определенному Preference , будь то это EditTextPreference или другие. Другими словами, как код сохранения в a Preference узнает, что он должен хранить пользовательский ввод в одном конкретном SharedPreferences объекте, а не в другом?

Чтобы подробнее объяснить мой вопрос на примере, предположим, у меня есть следующее:

 SharedPreferences prefs1 = getSharedPreferences(file1, mode);
SharedPreferences prefs2 = getSharedPreferences(file2, mode);
  

Мой вопрос в том, какой API я должен использовать, чтобы он prefs1 использовался кодом сохранения Preference объектов, а не prefs2 .

Целью является Nexus One, работающий под управлением 2.3.4.

Возможно, ответ очевиден, но я не смог найти его после прочтения документации и поиска в Интернете. Заранее благодарю вас за вашу помощь.

Ответ №1:

Другими словами, как код сохранения в предпочтении узнает, что он должен хранить пользовательский ввод в одном конкретном объекте SharedPreferences, а не в другом?

Preference использует PreferenceManager ‘s getSharedPreferences() , который в конечном итоге перенаправляет на getDefaultSharedPreferences() .

Вы можете создавать свои собственные Preference подклассы, которые изменяют это поведение, но поскольку система экрана предпочтений может быть не рассчитана на обработку нескольких SharedPreference объектов, есть вероятность, что изменения ваших предпочтений могут не сохраниться.

Итак, я призываю вас пересмотреть:

В нашем приложении мне нужно обработать два набора настроек

Комментарии:

1. Спасибо, что нашли время ответить. Возможно, я ошибаюсь, но если Preference в конечном итоге используется getDefaultSharedPreferences() , то это означает, что нет никакого способа не привязать его к иерархии предпочтений (т. Е. возвращению null ), поскольку всегда есть значение по умолчанию, которое можно получить. Что касается двух наборов предпочтений, я имел в виду два разных набора настроек. Примером может служить 3D-игра: одним из наборов могут быть «Настройки 3D» (или настройки движка). Другим будет «Настройки игры» (или настройки приложения). Для меня не так уж странно, что к обоим можно получить доступ в приложении.

2. @alokoko: Я полагаю, что «Иерархия предпочтений» здесь относится к набору инициализированных объектов предпочтений в PreferenceGroup, которые коллективно привязаны к PreferenceManager. Предпочтение!= SharedPreference.

3. @alokoko: «Примером может служить 3D-игра: одним набором могут быть «Настройки 3D» (или настройки движка). Другим будет «Настройки игры» (или «настройки приложения»)» — это не два набора настроек. Это один набор настроек, которые вы можете визуально различать с помощью PreferenceFragment , PreferenceCategory и / или вложенных PreferenceScreen объектов.

4. Спасибо за разъяснение. Я знаю, что предпочтение не является SharedPreference, но теперь я думаю, что понимаю, что пытается сказать документ: например, если код является Preference p = new Preference() , а затем код вызывает p.getSharedPreferences() без добавления его в иерархию, как вы сказали, тогда это может (будет?) Возврат null .

5. @alokoko: Ваша интерпретация верна, насколько я могу судить, прочитав исходный код.