Android: BackStack BottomView с компонентом навигации - PullRequest
0 голосов
/ 29 мая 2020

Я новичок в компонентах навигации. Кроме того, я реализовал компонент навигации для своего приложения, у меня есть одно действие, в котором размещено несколько фрагментов, и дизайн такой, что фрагмент средства запуска, который равен LoginFragment, не должен зависеть от BottomView, в котором есть About, Why, Gallery, Press Release Пункты меню. Что я делаю, так это то, что я загружаю график аутентификации и график навигации нижнего вида в одном и том же фрагменте, но проблема в том, что навигационный контроллер проверяет их начальное место назначения, если пользователь находится в их начальном месте назначения. BottomView начальный пункт назначения, но мне нужно что-то другое, я хочу отправить пользователя на LoginFragment вместо завершения действия

Проверьте изображение ниже

Check the image below

Фрагмент кода

Nav Controller OnBackPressed

@SuppressLint("RestrictedApi")
fun onBackPressed() {
    val navController = fragmentManager.findFragmentById(containerId)!!
        .findNavController()

    when {
        navController.backStack.size > 2 ->{
            navController.popBackStack()
        }

        // Fragment back stack is empty so try to go back on the navigation stack
        navigationBackStack.size > 1 -> {
            Log.d(TAG, "logInfo: BNC: backstack size > 1")

            // Remove last item from back stack
            navigationBackStack.removeLast()

            // Update the container with new fragment
            onNavigationItemSelected()
        }
        // If the stack has only one and it's not the navigation home we should
        // ensure that the application always leave from startDestination
        navigationBackStack.last() != appStartDestinationId -> {
            Log.d(TAG, "logInfo: BNC: start != current")
            navigationBackStack.removeLast()
            navigationBackStack.add(0, appStartDestinationId)
            onNavigationItemSelected()
        }
        // Navigation stack is empty, so finish the activity
        else -> {
            Log.d(TAG, "logInfo: BNC: FINISH")
            activity.finish()
        }
    }
}

Основной код активности

Настройка навигации График для аутентификации, т.е. вход, регистрация

private fun createNavHost(){
    val isSessionActive = intent.getBooleanExtra("isSessionActive", false)
    val navHost = if (isSessionActive) {
        MainNavHostFragment.create(
            R.navigation.active_session_nav_graph
        )
    } else {
        MainNavHostFragment.create(
            R.navigation.main_nav_graph
        )
    }
    supportFragmentManager.beginTransaction()
        .replace(
            R.id.main_fragments_container,
            navHost,
            getString(R.string.MainNavHost)
        )
        .setPrimaryNavigationFragment(navHost)
        .commit()
}

График навигации для просмотра снизу

private val bottomNavController by lazy(LazyThreadSafetyMode.NONE) {
    BottomNavController(
        this,
        R.id.main_fragments_container,
        R.id.menu_nav_info,
        this)
}

Есть ли лучший подход для достижения этого варианта использования?

...