Обрабатывать фрагмент навигации назад и вид снизу выбранного элемента - PullRequest
0 голосов
/ 11 июня 2019

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

Как-то так:

A-> A1

B-> B1

С-> С1> С2

D-> D1

E-> E1-> E2

Где A, B, C, D & E - параметры (MenuItem) для нижнего навигационного представления, а A1, B1, C1, D1, E1 - фрагменты ввода для этих параметров соответственно

Требуемая навигация заключается в том, что точкой входа и выхода приложения всегда будет опция А (фрагмент записи А1). Поэтому, если пользователь переходит к другому параметру, если он находится во фрагменте записи для этого параметра, поведение для любой обратной навигации должно заключаться в переходе к параметру A.

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

Например, если пользователь переходит к опции E, тогда в E1 выполняется действие, которое переходит к E2 a, а затем переходит к опции B, если пользователь нажимает кнопку «Назад», приложение должно перейти к опции A, потому что находится во фрагменте записи B1. Кроме того, если пользователь переходит к варианту А с использованием нижнего навигационного окна и затем нажимает кнопку «Назад», так как мы находимся в точке выхода, мы должны завершить приложение.

В OnNavigationItemSelectedListener я заменяю текущий фрагмент для фрагмента записи для выбранной опции, используя beginTransaction.replace для любых опций, кроме опции AI, добавьте addToBackStack(null), но это само по себе не соответствует требуемой навигации, так как если пользователь нажимает Кнопка «Назад», которая используется для перехода к варианту А, позволяет перейти к предыдущему выбранному параметру. A также пытался вытолкнуть задний пакет до замены фрагмента с помощью popBackStack(BACK_STACK_HOME_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE) и замены, добавив addToBackStack(BACK_STACK_HOME_TAG), но каким-то образом при выборе второго параметра вместо показа фрагмента записи для выбранного параметра отображается фрагмент A1

.
navBar.setOnNavigationItemReselectedListener {
    when(it.itemId) {
        R.id.optionA -> {

            // Removes all entries in the backstack if any
            if (supportFragmentManager.backStackEntryCount > 0) {
                supportFragmentManager.popBackStack(
                    null,FragmentManager.POP_BACK_STACK_INCLUSIVE
                )

                return@setOnNavigationItemSelectedListener true
            }

            // Replaces/add the entry fragment
            supportFragmentManager.beginTransaction()
                    .replace(R.id.fragmentHost, FragmentA1())
                    .commit()
            return@setOnNavigationItemSelectedListener true
        }

        R.id.optionB -> {
            // Removes all entries in the backstack up to BACK_STACK_HOME_TAG
            supportFragmentManager.popBackStack(
                BACK_STACK_HOME_TAG,
                FragmentManager.POP_BACK_STACK_INCLUSIVE
            )

            // Replace the fragment with the entry FragmentB1
            supportFragmentManager.beginTransaction()
                    .replace(R.id.fragmentHost, FragmentB1())
                    .addToBackStack(BACK_STACK_HOME_TAG)
                    .commit()

            return@setOnNavigationItemSelectedListener true
        }

        R.id.optionC -> {
            // Removes all entries in the backstack up to BACK_STACK_HOME_TAG
            supportFragmentManager.popBackStack(
                BACK_STACK_HOME_TAG,
                FragmentManager.POP_BACK_STACK_INCLUSIVE
            )

            // Replace the fragment with the entry FragmentC1
            supportFragmentManager.beginTransaction()
                    .replace(R.id.fragmentHost, FragmentC1())
                    .addToBackStack(BACK_STACK_HOME_TAG)
                    .commit()

            return@setOnNavigationItemSelectedListener true
        }

        ...

        return@setOnNavigationItemSelectedListener false
    }
}



override fun onBackPressed() {
    if (supportFragmentManager.backStackEntryCount > 0) {
        supportFragmentManager.popBackStack()
        return
    }

    super.onBackPressed()
}

Ответы [ 2 ]

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

Установить состояние BACK_STACK_HOME_TAG только при добавлении фрагмента A1.При добавлении фрагмента B1, C1, D1 ... нет необходимости возвращаться в исходное состояниеПереопределите onKeyDown () во фрагменте A1, заставьте его выйти из приложения:System.exit(0);Переопределите onKeyDown () во фрагменте B1, C1, D1 ..., установите его обратно в A1 следующим образом:fragmentManager().popBackStack(BACK_STACK_HOME_TAG, 0);Для A2, B2, C2, D2 ... просто всплыть, чтобы вернуться к A1, B1, C1, D1 ...fragmentManager().popBackStack();

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

Вы должны просто переопределить метод Activity.OnBackPressed() в BaseActivity, который будет наследовать каждый из ваших действий.В этой функции просто проверьте, имеет ли текущая активность тип A.Если да, выйдите из приложения, в противном случае запустите действие A.

...