Android: как открыть диалоговое окно ListPreference из-за пределов PreferenceActivity / PreferenceFragment?

#android #android-preferences #preferencefragment

#Android #android-настройки #preferencefragment

Вопрос:

Я создал меню настроек для своего приложения на основе PreferenceFragment и хотел бы получить доступ к диалоговым окнам настроек из других частей приложения без необходимости открывать меню настроек.

В моем меню настроек есть это:

меню настроек

и я хочу показать тот же диалог, когда я нажимаю этот пункт меню из основного действия:

основное действие

В главном Activity есть тот ListFragment , в котором находится весь код обработки пользовательского интерфейса. Ни то, ни другое не является PreferenceActivity or PreferenceFragment .

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

Я думал, что добавление PreferenceFragment FragmentManager в основной Activity будет правильно создавать его экземпляр, но, похоже, это не работает.

Из моего кода обработчика меню для опции «Сортировать»:

     SettingsFragment fragment = (SettingsFragment) getFragmentManager().findFragmentByTag(SettingsActivity.FRAGMENT_TAG);

    // first run case
    if (fragment == null) {
        fragment = SettingsFragment.newInstance(getActivity());
        getFragmentManager().beginTransaction().add(fragment, SettingsActivity.FRAGMENT_TAG).commit();
    } 

    CustomListPreference listPref = (CustomListPreference) fragment.findPreference(SettingsFragment.KEY_PREF_SORTORDER);
    listPref.show(); // invokes showDialog(null)
 

Это приводит к сбою при NullPointerException включении listPref , что показывает PreferenceFragment , что он не был правильно инициализирован.

Есть ли какой-либо способ добиться этого эффекта, или я должен написать функциональность как AlertDialog и вручную обработать изменения предпочтений?

Ответ №1:

Я думаю, вам придется написать эту функциональность самостоятельно вне классов предпочтений.

Preference, PreferenceActivity и PreferenceFragment были разработаны для совместной работы, чтобы обеспечить согласованный пользовательский интерфейс для приложений Android. Поэтому рекомендуется использовать их вместе, как они и предполагались.

Вы не можете напрямую копировать пользовательский интерфейс PreferenceActivity или PreferenceFragment за пределами этих двух классов в обычном activity, потому что пользовательский интерфейс построен из объектов предпочтений, а не объектов просмотра, как обычные Activities. Поэтому, если вам нужен этот конкретный пользовательский интерфейс, вам придется попытаться дублировать его с помощью пользовательских представлений.

https://discussions.udacity.com/t/way-to-do-listpreference-outside-of-settings-menu/45473