Подтвердить что ты не робот

PreferenceFragment - Разница между getPreferenceManager() и getPreferenceScreen()?

Я реализовал свой собственный подкласс PreferenceFragment (подробный здесь) и хочу прослушать изменения предпочтений внутри него. PreferenceFragment предоставляет вам два способа сделать это:

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

и

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

Какой из них следует использовать? Какая разница? Я действительно не понимаю различия в документах Android.

4b9b3361

Ответ 1

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

В вашем вопросе подразумевается, что вы считаете, что существует разница между тем, что делают PreferenceManager.getSharedPreferences() и PreferenceScreen.getSharedPreferences(), но в соответствии с исходным кодом они идентичны.

PreferenceScreen:

public SharedPreferences getSharedPreferences() {
     if (mPreferenceManager == null) {
         return null;
     }

     return mPreferenceManager.getSharedPreferences();
 }

Таким образом, PreferenceManger и PreferenceScreen являются разными сущностями, но SharedPreference возвращает этот метод как один и тот же объект, так как PreferenceScreen вызывает метод из PreferenceManager. Надеюсь, это ответ, который вы искали.

Если у вас есть выбор, перейдите к PreferenceManager.getSharedPreferences(), это станет более очевидным и вызовет один метод внутри.

Забавный факт:

PreferenceFragment:

public PreferenceManager getPreferenceManager() {
    return mPreferenceManager;
}

public PreferenceScreen getPreferenceScreen() {
    return mPreferenceManager.getPreferenceScreen();
}

Ответ 2

Первый получает общие настройки из PreferenceManager. Второй из PreferenceScreen, который наследует этот метод из класса Preference.

Я думаю, что это не функциональная разница, потому что оба возвращают, вероятно, один и тот же экземпляр объектов SharedPreferences, но я думаю, что лучше использовать первый (используя PreferenceManager вместо PreferenceScreen).

Ответ 3

PreferenceScreen см. domentation здесь

Класс PreferenceScreen может отображаться в двух местах:

  • Когда функция PreferenceActivity указывает на это, она используется как корень и не отображается (отображаются только указанные предпочтения).
  • Когда он появляется внутри другой иерархии предпочтений, он отображается и служит в качестве шлюза к другому экрану предпочтений (либо показывая другой экран предпочтений в виде диалога или через startActivity (android.content.Intent) из getIntent()). дети этого экрана предпочтений НЕ отображаются на экране, что этот экран предпочтения показан в. Вместо этого отдельный экран будет отображается при нажатии этого предпочтения.

PreferenceManager см. документацию здесь:

Разница:

getPreferenceManager () возвращает текущий менеджер предпочтений, связанный с фрагментом.

getPreferenceScreen () возвращает корень PreferenceScreen, т.е. экран предпочтений root, используемый в фрагменте из файла XML-предпочтений (preferences.xml).