繁体   English   中英

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

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

我遵循了开发人员指南并在我的单活动应用程序中添加了一个DrawerLayout 我的活动布局如下所示:

<?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>

我的活动代码是这样的:

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)
    }

}

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

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

请注意,在 Activity 中实现onCreateOptionsMenu()并在那里膨胀菜单什么都不做。

导航抽屉的材料设计指南表明抽屉应该在应用栏上方 go。 使用默认操作栏时这是不可能的,因为该操作栏始终位于您提供的任何内容之上。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM