Прежде всего, извините, если это дубликат какой-либо темы, я искал и не нашел ничего похожего на мой случай, или, по крайней мере, ничего, что могло бы помочь мне решить мою проблему.
В основном я хотел бы знать, каков наилучший способ навигации между фрагментами при простом и чистом вызове метода 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, поскольку я имею дело с (несколько) сложным проектом.
Спасибо за ваше время, дайте мне знать, если мне нужно предоставить больше информации /контекст!