SetupWithNavController 不适用于工具栏

12 android kotlin android-architecture-components androidx

我正在尝试将工具栏绑定到导航控制器,为此我使用以下代码:

NavigationUI.setupWithNavController(toolbar, NavHostFragment.findNavController(nav_host))
Run Code Online (Sandbox Code Playgroud)

在菜单文件中,我提供了应用程序应导航到的片段的 ID,如下所示:

<item
    android:id="@+id/menuFragment"
    android:orderInCategory="100"
    android:title="@string/action_settings"
    app:showAsAction="never" />
Run Code Online (Sandbox Code Playgroud)

我有一个简单的导航图文件,如下所示:

<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/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.vapoyan.myapplication.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/action_homeFragment_to_menuFragment"
            app:destination="@id/menuFragment" />
    </fragment>

    <fragment
        android:id="@+id/menuFragment"
        android:name="com.vapoyan.myapplication.MenuFragment"
        android:label="fragment_menu"
        tools:layout="@layout/fragment_menu" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

有没有人有经验或可以建议我如何解决问题,导航组件是否支持工具栏?

任何示例代码或参考?

小智 13

最后,我在Google CodeLab 的帮助下找到了解决方案

我缺少的是:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
     return NavigationUI.onNavDestinationSelected(item, NavHostFragment.findNavController(nav_host))
            || super.onOptionsItemSelected(item)
}
Run Code Online (Sandbox Code Playgroud)

另外,如果您想获得后退按钮支持,您需要在onCreate方法中添加:

NavigationUI.setupWithNavController(toolbar, NavHostFragment.findNavController(nav_host))
Run Code Online (Sandbox Code Playgroud)

基本上,在我的理解中,只是id为菜单项和调用提供正确的片段setupWithNavController应该可以工作,但是这个假设是不正确的,或者在当前版本(1.0.0-alpha07)中,谷歌人改变了一些东西。所以现在它工作正常。

如果您发现有一种方法可以缩短 :) 或更好 :) 请告诉我。


tzg*_*tzg 8

除了上面的答案。确保导航和项目的 id 匹配。

android:id="@+id/menuFragment"
Run Code Online (Sandbox Code Playgroud)

我被挂断了,因为我为每个元素都有单独的 id。


Cat*_*luc 2

我在我的应用程序中使用导航抽屉,但我认为这对于您的情况来说已经足够了:

此时我正在使用这个 android 库:在我的 build.gradle 中

 implementation 'android.arch.navigation:navigation-fragment:1.0.0-alpha07'
 implementation 'android.arch.navigation:navigation-ui:1.0.0-alpha07'
Run Code Online (Sandbox Code Playgroud)

在我的活动中

class MainActivity : BaseActivity() {

    @SuppressLint("RestrictedApi")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val navController = Navigation.findNavController(this, /*ur nav controller ID*/)

        // Set up ActionBar
        setSupportActionBar(/*ur toolbar*/)

        NavigationUI.setupActionBarWithNavController(this, navController)
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看文档,您可以找到更多信息:https://developer.android.com/topic/libraries/architecture/navigation/navigation-ui#create_a_toolbar