ANDROID Компонент навигации + BottomNavigationView с backstack - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу использовать навигационный компонент из Jetpack в моем приложении. Я мог найти базовые примеры работы навигационного компонента + навигация снизу, ниже я показал, как я реализовал, используя эти примеры. Но его работа некорректна для меня - его воссоздание фрагментов при переключении между вкладками. Но я нашел расширение Navatiom от Google https://github.com/android/architecture-components-samples/blob/master/NavigationAdvancedSample/app/src/main/java/com/example/android/navigationadvancedsample/NavigationExtensions.kt, но оно тоже не работает. Я делаю все в соответствии с инструкциями о моей деятельности:


    private fun setupBottomNavigationBar() {
            val bottomNavigationView = findViewById<BottomNavigationView>(R.id.nav_bottom)

            val navGraphIds = listOf(
                R.navigation.home_nav,
                R.navigation.search_nav,
                R.navigation.scheduled_nav,
                R.navigation.profile_nav
            )

            val controller = bottomNavigationView.setupWithNavController(
                navGraphIds,
                supportFragmentManager,
                R.id.nav_host_container,
                intent
            )

            controller.observe(this, Observer { navController ->
                setupActionBarWithNavController(navController)
            })
            currentNavController = controller
        }

Я вызываю эту функцию в onCreate (когда saveInstanceState == null) и в onRestoreInstanceState мой файл макета:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".app.ui.main.MainActivity">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/nav_bottom"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@drawable/back_bottom_navigation"
        android:layout_alignParentBottom="true"
        app:menu="@menu/bot_nav_menu"
        app:labelVisibilityMode="unlabeled"
        app:itemIconTint="@color/bot_navigation_items"
        app:itemTextColor="@color/bot_navigation_items"
        />

</LinearLayout>

, и это точно такой же код, как в примере. Но это не работает, фрагменты не отображаются, и если setupItemReselected (graphIdToTagMap, fragManager) ) установлено в расширении навигации, в этой функции вызывается ошибка в строке val selectedFragment = fragmentManager.findFragmentByTag (newlySelectedItemTag) с ошибкой kotlin.TypeCastException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment, поэтому менеджер фрагментов не может найти фрагмент по тегу (?) Пожалуйста, помогите мне, ребята, я исследую эту проблему второй день !

1 Ответ

0 голосов
/ 14 апреля 2020

Вы не установили FragmentContainerView, вам нужно сделать следующее:

<androidx.fragment.app.FragmentContainerView
            android:id="@+id/nav_host_container"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/mobile_navigation" />

Посмотрите на codelab , вы можете заменить fragment на FragmentcontainerView и все получится.

Если xml не устранит вашу проблему, вы можете опубликовать свой nav_graph?

...