Android Jetpack导航组件和BottomAppBar菜单交互

时间:2018-07-26 09:33:35

标签: android android-fragments android-architecture-components android-navigation android-jetpack

我正在尝试在项目中实现Navigation,而我的主要活动是Top App BarBottom App Bar

这是我所采取的步骤。

在我的活动布局中

<android.support.design.widget.CoordinatorLayout>
       <android.support.design.widget.AppBarLayout>
           <android.support.v7.widget.Toolbar/>
       </android.support.design.widget.AppBarLayout>

  <fragment
        android:id="@+id/navigation_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="?attr/actionBarSize"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation_graph" />

<android.support.design.bottomappbar.BottomAppBar/>

我有2个片段,比如FragmentStartFragmentToGoTo,所以在我的导航图中,我有

<navigation
    android:id="@+id/navigation_graph.xml"
    app:startDestination="@id/fragmentStart">

    <fragment
        android:id="@+id/fragmentStart"
        android:name="com.FragmentStart">
        <action
            android:id="@+id/goToFragment"
            app:destination="@id/fragmentToGoTo" />
    </fragment>
    <fragment
        android:id="@+id/fragmentToGoTo"
        android:name="com.FragmentToGoTo"
        />
</navigation>

Bottom App Bar菜单具有以下项目:

 <item
        android:id="@id/fragmentToGoTo"
        android:title="Title"
        app:showAsAction="always" />

然后进行我的活动

val navController = Navigation.findNavController(this, R.id.navigation_fragment)
myBottomBar.replaceMenu(R.menu.menu_with_nav_item)

myBottomBar.setupWithNavController(navController)
//or I've also tried
//NavigationUI.setupWithNavController(myBottomBar, navController, null)

发生的事情是,当单击菜单项时,导航不会触发,并且根据我的阅读,如果菜单项的ID与导航图中的片段相同,则它应该可以直接工作。 如果我添加OnMenuItemClickListener,则可以在菜单上按do findNavController(R.id.navigation_fragment).navigate(R.id.fragmentToGoTo),它可以工作。我只是希望有一种自动的方式,因为它应该可用。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

我是 Kotlin 的新手,但我遇到了同样的问题。

您还必须将 menunavController 联系起来:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
  val navController = findNavController(R.id.fragmentContainer)
  return item.onNavDestinationSelected(navController) ||
    super.onOptionsItemSelected(item)
}

只需将这些代码粘贴到您的 MainActivity.kt 中即可。

我从 Android 文档中获得了代码:https://developer.android.com/guide/navigation/navigation-ui#Tie-navdrawer