从片段导航时底部导航栏出现故障

问题描述 投票:0回答:3

我将底部导航栏与导航组件一起使用

为了使这两个组件协同工作,我调用了:

bottomNavigationView.setupWithNavController(navController)

一切都按预期工作,除非我从片段内部而不是底部导航栏导航

enter image description here

“查看全部”从底部导航栏打开与“报告”相同的片段

binding.viewAllScansTv.setOnClickListener {
    val action = MainFragmentDirections.actionMainFragmentToReportsFragment()
    navController.navigate(action)
}

单击“查看全部”后,片段将打开,“报告”按钮被选中,但是,导航回“主页”不再起作用

我该如何解决这个奇怪的行为?

导航图:

<navigation app:startDestination="@id/mainFragment">
    <fragment
        android:id="@+id/mainFragment"
        android:name="com.package.name.ui.main.MainFragment"
        android:label="MainFragment"> 
        <action                android:id="@+id/action_mainFragment_to_reportsFragment"
            app:destination="@id/reportsFragment" />
    </fragment>
</navigation>

底部导航菜单:

<menu>
    <item
        android:id="@+id/mainFragment"
        android:title="Home"/>    
    <item
        android:id="@+id/reportsFragment"
        android:title="Reports"/>
    <item
        android:id="@+id/settingsFragment"
        android:title="My account"/>
</menu>
android navigation bottomnavigationview
3个回答
14
投票

正如 @ianhanniballake 在评论中提到的,类似的问题也发布在 here

我最终做的是替换

val action = MainFragmentDirections.actionMainFragmentToReportsFragment()
navController.navigate(action)

val item = mainBottomNavigationView.menu.findItem(R.id.reportsFragment)
NavigationUI.onNavDestinationSelected(item, navController)

所以基本上我使用

NavigationUI
API 进行导航,以便它正确跟踪返回堆栈。
NavigationUI
内部正在使用相同的
BottomNavigationView
API


6
投票

您当前的答案很好,但如果您需要传递参数,它就不起作用,所以使用这个

在导航 XML 中将这些行添加到操作中

app:launchSingleTop="true"
app:popUpTo="@+id/main_navigation"
app:popUpToInclusive="true"

并确保

app:popUpTo="@+id/main_navigation"
与您的导航 xml 具有相同的 id

所以最终的动作应该是这样的:

     <action
            android:id="@+id/action_cameraFragment_to_searchFragment"
            app:destination="@id/searchFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/main_navigation"
            app:popUpToInclusive="true"/>

并使用该操作正常导航

val action = CameraFragmentDirections.actionCameraFragmentToSearchFragment()
findNavController().navigate(action)

1
投票

在任何视图上设置点击监听器应该具有与用户点击底部导航中相应项目相同的效果。所以您需要在

setSelectedItemId()
上拨打
BottomNavigationView

val mainBottomNav =
                activity?.findViewById<BottomNavigationView>(R.id.homeBottomNavigation)
            mainBottomNav?.selectedItemId = R.id.baseHomeFragment
© www.soinside.com 2019 - 2024. All rights reserved.