Каков простой способ навигации назад между многими фрагментами? - PullRequest
0 голосов
/ 21 июня 2019

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

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

У меня есть Activity, которая вызывает фрагмент (давайте назовем его ListFrag).Этот ListFrag показывает список элементов, которые при нажатии вызывают другой фрагмент с деталями этого элемента (назовем его DetailFrag).Это просто и все работает хорошо: ListFrag вызывает DetailFrag, нажатие кнопки «Назад» просто перемещает назад, как и ожидалось.Хорошо!

Но моя проблема в том, что теперь я добавил дополнительный шаг между ListFrag и DetailFrag.Теперь ListFrag будет вызывать другой фрагмент с именем PagerFrag, который позволит нам разбивать на страницы с помощью Swiping (используя FragmentStatePagerAdapter), показывая несколько DetailFrags один за другим.Кроме того, мне нужно поддерживать два случая:

Случай 1 : пользователь использует смартфон, и навигационный поток будет ListFrag> PagerFrag> DetailFrag, независимо от ориентации устройства.

Случай 2 : пользователь использует планшет, который будет работать в качестве первого случая, если он находится в режиме книжной ориентации, но если он находится в режиме альбомной ориентации, ему придется игнорировать PagerFrag (мы выиграли)я не могу сделать разбиение на страницы, проводя пальцем) и отображая ListFrag и DetailFrag на одном макете.

Опять же, я проделал некоторую работу, и она работает довольно хорошо во всех случаях.Основная проблема заключается в том, что навигация BACKWARDS: нажатие кнопки BackButton стало кошмаром, потому что я совершенно не понимаю, как FragmentManager укладывает фрагменты (или FragmentTransactions, если я не ошибаюсь), поскольку PagerFrag добавляет более одного DetailFrag кстек (предыдущий, текущий и следующий в пейджере).Я должен постоянно проверять «если (фрагмент является DetailFrag)» в методе onBackPressed (), чтобы иметь возможность указать приложению, куда идти дальше.

И подумать об этой ситуации: пользователь использует планшет вПортретный режим.Пользователь перемещается по списку ListFrag> PagerFrag> DetailFrag.Затем пользователь меняет ориентацию устройства.Я должен «убить» Пейджер и DetailFrag, воссоздать ListFrag с другим макетом XML (тот, который показывает 2 фрагмента рядом) и надуть там DetailFrag.

Это работает, но всеэти обходные пути уродливы и на самом деле не соответствуют рекомендациям.Это делает код очень скучным для поддержки / повторного использования.

Я использую одну единственную ViewModel для соединения Activity и 3 фрагментов, и с помощью LiveData мне удается правильно отображать информацию в пользовательском интерфейсе.Данные элементов не являются проблемой, просто обратная навигация между всеми этими фрагментами.

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

Мое текущее решение выглядит примерно так:

override fun onBackPressed() {

        if (supportFragmentManager.backStackEntryCount == 0) {
            super.onBackPressed()
        } else {
            if(supportFragmentManager.fragments.first() is PagerFrag ||
                    (!viewModel.isTwoPane)){
/* isTwoPane indicates if we will have 2 fragments side by side if it's a tablet in landscape mode */
                for(frag in supportFragmentManager.fragments) {
                    if(frag is DetailFrag) {
                        supportFragmentManager
                                .beginTransaction()
                                .remove(frag)
                                .commit()
                    }
                }
            }
            supportFragmentManager.popBackStackImmediate()
        }

    }

И еще несколько строк в методе onCreatedView () фрагмента для обработки в случае повторного создания действия (изменение ориентации).

Так что я ожидаю найти простой способ навигации назад между фрагментами без необходимости проверять что-то вроде «Использует ли пользователь планшет в альбомном режиме и просматривает ли DetailFrag?, это и то."Я бы предпочел пока не использовать новую AndroidX Navigation, поскольку я имею дело с (несколько) сложным проектом.

Спасибо за ваше время, дайте мне знать, если мне нужно предоставить больше информации /контекст!

1 Ответ

0 голосов
/ 26 июня 2019

Поработав немного больше с Back Stack и проверив все проверки экземпляров в методе onBackPressed (), я решил еще раз попробовать Архитектура навигации AndroidX , как JDevoloper предложил в комментариях, и оказалось, что он работал отлично. Это действительно отличное решение. У меня все еще были некоторые проблемы с ViewPager и с обработкой навигации при изменении ориентации устройства, но теперь все решено и работает как положено. Спасибо за помощь!

...