使用带 DrawerLayout 的导航组件时如何修改 Toolbar/ActionBar?

How do I modify the Toolbar/ActionBar when using the Navigation Component with a DrawerLayout?

我已经按照 Developer Guide 添加了一个 DrawerLayout 到我的单一 Activity 应用程序。我的 activity 布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <fragment
            android:id="@+id/navHostFragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/nav_graph"/>
    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/nav"
        app:headerLayout="@layout/nav_view_header"
        app:itemTextColor="@color/lightGrey"/>

</androidx.drawerlayout.widget.DrawerLayout>

我的 Activity 代码是这样的:

class MainActivity : AppCompatActivity() {

    private val logTag = MainActivity::class.java.name

    private lateinit var appBarConfiguration : AppBarConfiguration

    private var model: Model? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        val navController = findNavController(R.id.navHostFragment)

        appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)

        setupActionBarWithNavController(navController, appBarConfiguration)
        navigation.setupWithNavController(navController)

        navigation.menu.getItem(0).icon = getDrawable(R.drawable.ic_completed)
        navigation.menu.getItem(1).icon = getDrawable(R.drawable.ic_remaining)

        val viewModel: CommandViewModel by viewModels()
        viewModel.command.observe(this,  Observer<Command>{command ->
            model = getModel(this)
            val navHeaderView = navigation.getHeaderView(0)
            val completion  = navHeaderView.findViewById<TextView>(R.id.completion)
            completion.text = model?.completionMessage(this)
        })
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return item.onNavDestinationSelected(findNavController(R.id.navHostFragment))
                || super.onOptionsItemSelected(item)
    }

    override fun onSupportNavigateUp(): Boolean {
        return findNavController(R.id.navHostFragment).navigateUp(appBarConfiguration)
    }

}

请注意布局中没有工具栏实例。导航组件正在为我创建一个。如果我将一个添加到布局中,我会在屏幕上的第一个下方得到另一个。

现在我想在工具栏的右侧添加一个按钮(实际上是一个 ToggleButton)。当工具栏没有布局 XML 时,我该怎么做?我宁愿在 XML 而不是 Java/Kotlin 中执行此操作,如果都一样的话。

请注意,在 Activity 中实施 onCreateOptionsMenu() 并在其中展开菜单没有任何作用。

material design guidelines for the navigation drawer 表示抽屉应该越过应用栏。使用默认操作栏时这是不可能的,因为该操作栏始终位于您提供的任何内容之上。

相反,您必须向您的布局添加 Toolbar 并为您的 activity 使用 NoActionBar 主题(这会删除默认操作栏)- 只需确保在调用 setupActionBarWithNavController() 之前调用 setSupportActionBar(toolbar) 以使用您的 Toolbar 作为操作栏。

在您的布局中拥有自己的 Toolbar 后,您可以直接向其添加视图。