Отключить фрагмент из Backstack, используя компонент Navigation - PullRequest
1 голос
/ 21 апреля 2019

У меня есть фрагменты X, A, B и я использую компонент архитектуры навигации для навигации между ними.

Фрагменты A, B специфичны, но фрагмент X может быть любым (C, D, ...);

Фрагменты A и B из нижней навигации и их «значки навигации» всегда на экране, это означает, что пользователь может в любой момент перейти к A или B из любого фрагмента (включая A и B):


X -> A -> B

X -> B -> A

A -> B -> X

A -> B -> A

//another ways


Моя проблема в этом случае:

X -> A -> B -> A -> B -> ?

Если пользователь начал с X, достиг ? и начал возвращаться с помощью кнопки «назад», он бросает A, B несколько раз:

Пользователь нажал назад:

? -> B -> A -> B -> A -> X

Но я хочу «исключить» фрагменты из backstack, еслиони уже на нем:

? -> A -> B -> X

Если пользователь перемещается:

X -> A -> B -> A

Я хочу видеть:

A -> B -> X

Не:

A -> B -> A -> X

Я пытаюсь сделать это с помощью Pop To, но он может вернуть меня только на один конкретный фрагмент.Мне нужно вернуться на начатый фрагмент X, а не в жестком коде.Inclusive and Single top не об этом.

Я не уверен, что смогу сделать это с базовым компонентом навигации, поэтому мне нужен ваш советЕсли я не могу сделать это, каким способом я должен использовать?Есть ли полезные практики по этому поводу?


UPD:

Я использую глобальные точки для навигации между фрагментами.Вот как выглядит моя навигация:

enter image description here

Правая | нижняя цепочка - X, я могу переходить от любого к ней до не измененных фрагментов, используя нижнююнавигации.Это Приложение для одного занятия , для навигации я использую всего лишь:

   //Using global points
   findNavController(R.id.host).navigate(R.id.toLibrary)

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

Здесь мы собираемся тщательно управлять нашими фрагментами. Прежде всего , мы подписываем наши фрагменты с помощью тега, чтобы впоследствии получить или обработать их. Как вы знаете, с помощью кода ниже, мы добавляем тег к фрагменту, который " X " (который может быть любым фрагментом) и " A " и, наконец, " B"

 fragmentManager.beginTransaction()
.replace(R.id.FragmentHolder, Fragment_A_or_B_or_Any, "A or B or X")
.addToBackStack(tag).commit();

Помните, что вы должны подписать любой фрагмент вашей транзакции .

Следующий шаг - Обработка public void onBackPressed()

Вы должны игнорировать super.onBackPressed();, потому что мы не хотим, чтобы он обрабатывал стек, и мы собираемся его обработать.

Вот, пожалуйста,

@Override
public void onBackPressed() {
    if(isVisible("A")) //Go some where else you wanna go
    else if(isVisible("B")) //Go some where else you wanna go
    else if(isVisible("X or any") //Go some where else you wanna go
    else //Go default page   
}


public boolean isVisible(String tag){
        try {
            Fragment fragment = fragmentManager.findFragmentByTag(tag);
            if (fragment != null && fragment.isVisible())
                return true;
            else
                return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
}

Когда происходит обратное нажатие, мы проверяем, какой фрагмент в данный момент видим, и пытаемся перенаправить Текущий вид туда, где мы хотим показать пользователю.

В настоящее время я использую этот метод для большого приложения, и все хорошо. Господин А.Ф. грантополучатель

0 голосов
/ 29 апреля 2019

возможно, эта статья поможет вам в вашей проблеме: https://developer.android.com/guide/navigation/navigation-getting-started#navigation_and_the_back_stack я думаю, что добавление popUpToInclusive к вашему навигационному фрагменту должно решить вашу проблему

0 голосов
/ 21 апреля 2019

В fragTransaction вместо использования addToBackStack () или add (...) используйте фрагментTransaction.replace (int containerViewId, фрагментный фрагмент, строковый тег)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...