Очистить фрагмент Backstack, кроме верхнего фрагмента - PullRequest
0 голосов
/ 18 февраля 2020

В моем приложении у меня есть несколько пунктов меню в окне навигации. Когда пользователь касается одного из этих элементов и переходит к соответствующему фрагменту, я хочу, чтобы обратный стек фрагмента был очищен, КРОМЕ этого фрагмента, к которому он только что перемещался. Позвольте мне проиллюстрировать:

В моем навигационном ящике у пользователя есть возможность открывать фрагменты F1, F2, F3, F4, F5, F6. Когда приложение впервые открывается, пользователь запускает на F1. Допустим, из F1 пользователь открывает фрагменты F7 -> F8 -> F9 -> F10, используя кнопки внутри самих фрагментов. На этом этапе backstack выглядит следующим образом:

F1 -> F7 -> F8 -> F9 -> F10

Предположим, что здесь пользователь открывает навигационную панель и выбирает F2. Я хочу, чтобы вышеприведенный backstack был очищен и заполнен ТОЛЬКО F2, поэтому пользователь не может go вернуться к F10 из F2. Другими словами, backstack должен стать:

Не это: F1 -> F7 -> F8 -> F9 -> F10 -> F2
Но это: F2

Как мне это сделать? sh это?

РЕДАКТИРОВАТЬ 1: Одним из моих попыток было добавить OnNavigationItemSelectedListener в навигацию ViewView при загрузке действия, которое очистило бы backstack при нажатии одного из элементов. Мое решение сработало, но в процессе я переопределил код по умолчанию, который фактически изменился на новый фрагмент. Я пролистал Android API и нашел это:

navigationView.setNavigationItemSelectedListener(
    new NavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        boolean handled = onNavDestinationSelected(item, navController);
        if (handled) {
            ViewParent parent = navigationView.getParent();
            if (parent instanceof DrawerLayout) {
                ((DrawerLayout) parent).closeDrawer(navigationView);
            } else {
                BottomSheetBehavior bottomSheetBehavior =
                                    findBottomSheetBehavior(navigationView);
                if (bottomSheetBehavior != null) {
                     bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
                }
            }
        }
        return handled;
    }
});

Это НЕ мой код. Это собственный код, который обрабатывает выбор пунктов меню в блоке навигации (находится в классе NavigationUI). Если я хочу добавить свой собственный OnNavigationItemSelectedListener, мне придется воссоздать функциональность, показанную выше, что я не могу сделать, так как некоторые из методов там защищены. Вот почему я не верю, что это решение будет работать.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Я надеюсь, что вы устанавливаете весь этот фрагмент в одном и том же упражнении. Если да, то не будет очень сложно достичь того, чего вы хотите достичь.

Убедитесь, что всякий раз, когда вы устанавливаете свой фрагмент в предположении MainActivity, следуйте этому коду.

val fragmentTransaction = supportFragmentManager.beginTransaction()
if (fragment == null) {
    fragment = Frag2.newInstance()
    fragmentTransaction.replace(R.id.container, fragment, Frag2.TAG)
} else {
    fragmentTransaction.show(fragment)
}
    fragmentTransaction.commit()

Основной лог c для достижения требуемого поведения отстает от fragmentTransaction.replace(). Поэтому, когда вы устанавливаете другой фрагмент в container, используйте replace() вместо add().

Итак, попробуйте это и дайте мне отзыв об этом. Удачного кодирования ..!

0 голосов
/ 18 февраля 2020

Вы можете попытаться очистить фрагменты, находящиеся в backstack

FragmentManager manager = getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 0) {
    FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
     manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
...