Как переключить домашний фрагмент между двумя различными фрагментами в зависимости от предпочтений пользователя
Я нахожусь в процессе добавления функции приложения моей команды, которая позволит пользователю выбирать между двумя различными домашними экранами. Обратите внимание, что оба эти экрана имеют разные ощущения.
Моя текущая установка для этого состоит в том, чтобы иметь 2 отдельных фрагмента Home1Fragment и Home2Fragment, которые оба расширяют абстрактный класс, называемый HomeFragment. Пользователь будет использовать Home1Fragment по умолчанию, пока он не изменит предпочтения на странице настроек.
Я реализовал оба этих фрагмента, и оба они работают должным образом, если они работают как домашний экран.
Моя проблема заключается в том, что я пытаюсь переключить их с одного фрагмента на другой. Я пытался это через
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getFragmentManager();
if(fragmentManager.getBackStackEntryCount() > 1) {
fragmentManager.popBackStackImmediate();
int option = getSharedPreferences('**hidden**', MODE_PRIVATE).get('home_screen_option', 0);
Fragment fragment = fragmentManager.findFragmentById(R.id.content);
if(fragment != null && fragment instanceof HomeFragment) {
if(f instanceof Home1Fragment && option == HOME_2) {
f = new Home2Fragment();
} else if (f instanceof Home2Fragment && option == HOME_1) {
f = new Home1Fragment();
}
}
} else {
finish();
}
}
В приведенном выше коде могут быть опечатки, потому что я написал их на лету без реального кода передо мной.
1 ответ
Вы фактически не устанавливаете новый фрагмент в своем коде.
Но я бы выбрал другой подход, который основан на сохраненном состоянии (например, настройка в общих настройках) и обрабатывается самим домашним экраном (вместо манипулирования задним стеком, против которого я выступаю).
Опция 1.
Пожалуйста, подумайте, если ваш домашний экран может быть отдельным Activity
, Таким образом, вы можете просто загрузить правильный фрагмент, когда Activity
начинается на основе значения, хранящегося в SharedPreferences
,
Вариант 2
Практически то же самое, просто используя вложенный фрагмент. Пусть ваш домашний экран будет Fragment
и добавьте контейнер для дочерних фрагментов в свой макет. Затем просто используйте дочерний менеджер фрагментов, чтобы загрузить правильное представление соответственно.