使用带 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
后,您可以直接向其添加视图。
我已经按照 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
后,您可以直接向其添加视图。