#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