Android Studio 导航到其他片段、切换到其他菜单并切换回初始菜单后,BottomNavigationView的菜单未被选中

zdwk9cvp  于 2022-11-16  发布在  Android
关注(0)|答案(4)|浏览(461)

我正在构建一个Android应用程序与3菜单使用底部导航。我创建了新的项目在Android工作室使用底部导航活动。
我将片段重命名为:

  • InfoFragment.kt
  • DetectFragment.kt
  • AboutFragment.kt

src/main/res/layout中的布局重命名为:

  • fragment_info.xml
  • fragment_detect.xml
  • fragment_about.xml

src/main/res/menu中的菜单重命名为:

  • navigation_info
  • navigation_detect
  • navigation_about

fragment_about.xml中,我添加了一个按钮buttonGoToFAQ,以导航到fragment_faqlike this,并在AboutFragment.kt中使用此代码

buttonGoToFAQ.setOnClickListener {
        val action = AboutFragmentDirections.actionFAQ()
        Navigation.findNavController(it).navigate(action)
    }

单击BottomNavigationView菜单navigation_infonavigation_detect,然后单击navigation_about菜单返回后,BottomNavigationView上的选定菜单没有更改。
是的。
我想要的是菜单navigation_about应该已经被选择,而不是其他菜单
我已经尝试过在FAQFragment.kt中覆盖fun onStart()fun onResume(),但没有效果。
nav_view是我底部导航视图

override fun onStart() {
    super.onStart()

    (requireActivity().findViewById<View>(R.id.nav_view) as BottomNavigationView).selectedItemId =
        R.id.navigation_about
}

我还认识到,所有BottomNavigationView菜单的id都与src/main/res/navigation xml文件中的id相同

9jyewag0

9jyewag01#

根据Google问题跟踪器-https://issuetracker.google.com/issues/210687967?pli=1的链接,这是预期行为
简单地说,Google希望我们使用嵌套导航图来链接FaqFragmentAboutFragment,这将导致无论何时打开其中一个片段,都会选择菜单navigation_about
1.在nav_graph.xml中,添加一个嵌套图-

<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/nav_graph"
    app:startDestination="@id/infoFragment">

<fragment
    android:id="@+id/infoFragment"
    android:name="......"
    android:label="..." >
        ....
</fragment>

<fragment
    android:id="@+id/detectFragment"
    android:name="......"
    android:label="...." >
        ....
</fragment>  

<navigation android:id="@+id/toAboutNav"
    app:startDestination="@id/aboutFragment">
    <fragment
        android:id="@+id/aboutFragment"
        android:name="....."
        android:label="....." >
        .......
    </fragment>

    <fragment
        android:id="@+id/faqFragment"
        android:name="...."
        android:label="...">
        ....
    </fragment>
</navigation>
</navigation>

1.另外,在menu文件夹中,在bottom_nav_menu.xml中进行以下更改

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@id/infoFragment"
        android:icon="...."
        android:title="...." />
    <item
        android:id="@id/detectFragment"
        android:icon="...."
        android:title="...." />
    <item
        android:id="@id/toAboutNav"
        android:icon="...."
        android:title="...." />
</menu>
3df52oht

3df52oht2#

几天后,我终于自己得到了答案。首先,我需要从MainActivity中得到BottomNavigationView,然后,你可以从另一个片段中改变菜单项的值。
MainActivity.kt中:

companion object {
    lateinit var binding: ActivityMainBinding
{

在片段上,
定义BottomNavigationView并在onResume()中设置所需的索引:

class FAQFragment : Fragment() {
    private val navView: BottomNavigationView = MainActivity.binding.navView

    ...

    override fun onResume() {
        super.onResume()

        navView.menu.getItem(2).isChecked = true
    }
}
eivnm1vs

eivnm1vs3#

您可以手动导航,并始终将true返回到OnItemSelectedListener以实现菜单项选择。

binding.bottomNavigation.setOnItemSelectedListener { item ->
    NavigationUI.onNavDestinationSelected(item, navController)
    true
}
xjreopfe

xjreopfe4#

正如@弗朗西斯所建议的,这就是您正在寻找的解决方案。我看到了您的答案,但这不是最佳解决方案,这只是您找到的一个变通方案。

bottomNavigationView.setOnItemSelectedListener {
  item - >
    // In order to get the expected behavior, you have to call default Navigation method manually
    NavigationUI.onNavDestinationSelected(item, navController)

  return @setOnItemSelectedListener true
}

相关问题