Возврат из вложенных фрагментов в ViewPager

Мне нужно отобразить несколько наборов инструкций для пользователя. Для каждой инструкции (FragmentA) пользователь может перейти к другому экрану (FragmentA1). Я использовал ViewPager, который содержит список фрагментов. Когда пользователь переходит к первому фрагменту (FragmentA), пользователь может нажать кнопку и перейти к подробному представлению инструкции (FragmentA1). Таким образом, каждая страница вьюпейджера способна открыть другой фрагмент.

Все работает нормально до сих пор. Проблема, с которой я сталкиваюсь, связана с backstack. Активность с адаптером viewpager обрабатывает методы moveToNext() и moveToPrevious(). Ниже приведена моя реализация метода onBackPressed():

 @Override
public void onBackPressed() {

    FragmentManager fm = getSupportFragmentManager();
    for (Fragment frag : fm.getFragments()) {
        if (frag.isVisible()) {
            FragmentManager fm = frag.getFragmentManager();
            if (fm.getBackStackEntryCount() > 0) {
                fm.popBackStack();
                return;
            } else {
                moveToPrevious();
                return;
            }
        }
    }
    super.onBackPressed();
}

С приведенной выше реализацией: если я прохожу FragA-> FragA1-> FragB-> FragB1-> FragC-> FragC1, когда я нахожусь в FragC1 и нажимаю кнопку «Назад», я сразу перехожу к FragB1 вместо FragC, а затем к FragA1 . Мне нужно пройти тот же путь назад, что и пройденный вперед.

Я не уверен, что не так, но он не может вытолкнуть вложенный фрагмент и отобразить его родительский фрагмент. Разве fm.popBackStack() не должен показывать родительский фрагмент?




Ответы (1)


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

 @Override
public void onBackPressed() {
    FragA fragment = (FragA) pagerAdapter.instantiateItem(viewPager, viewPager.getCurrentItem());

    if (fragment.getChildFragmentManager().getBackStackEntryCount() != 0) {
        fragment.getChildFragmentManager().popBackStack();
    }
    else {
        moveToPrevious();
    }
}
person nibz    schedule 21.06.2018
comment
если у вас есть какие-либо идеи, пожалуйста, проверьте мою ссылку ниже есть проблема"> stackoverflow.com/questions/63052712/ - person Sunil Chaudhary; 31.07.2020