4

我想在我的应用程序中使用来自 jetpack 的导航组件。我可以找到导航组件 + 底部视图导航的基本示例工作,下面我展示了我是如何使用这些示例实现的。但它对我来说不正确 - 它在选项卡之间切换时重新创建片段。但我从谷歌https://github.com/android/architecture-components-samples/blob/master/NavigationAdvancedSample/app/src/main/java/com/example/android/navigationadvancedsample/NavigationExtensions.kt找到了 navigatiom 扩展,但它也不起作用。我按照我的活动说明做所有事情:


    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 (当 savedInstanceState == 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, fragmentManager),则会在该函数中导致错误 val selectedFragment = fragmentManager.findFragmentByTag (newlySelectedItemTag) with error kotlin.TypeCastException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment,所以片段管理器无法按标签找到片段(?)请帮帮我,我第二天研究这个问题!

4

3 回答 3

2

今天,我面临的问题是我有一个底部导航和导航。但是在单击底部选项卡时没有更改片段。然后我通过为导航图提供与我在菜单项中设置的相同的 ID 来解决问题。这对我有用。正如答案中提到的,我通过@Ильмир Шагабиев 的评论得到了这个线索。将其发布为答案,因为在第一次我没有在评论中注意到这一点。花了一些时间后,我回到同一个帖子并浏览了所有评论。

于 2021-02-11T10:25:58.400 回答
1

您还没有设置您的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,你可以替换它fragmentFragmentcontainerView它会解决的。

如果 xml 没有解决您的问题,您可以发布您的nav_graph?

于 2020-04-14T19:16:08.250 回答
1

我遇到了同样的问题。如此处所述您必须确保底部导航菜单项的 ID 与导航图中的 ID 相同。因此,在您的情况下,底部导航菜单应类似于以下内容:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/home_nav"
        android:icon="..."
        android:title="..." />

    <item
        android:id="@+id/search_nav"
        android:icon="..."
        android:title="..." />

    <item
        android:id="@+id/scheduled_nav"
        android:icon="..."
        android:title="..." />

    <item
        android:id="@+id/profile_nav"
        android:icon="..."
        android:title="..." />

</menu>
于 2021-02-12T08:48:35.107 回答