使用 `navigation.navigateUp` 会错误地显示汉堡菜单
Using `navigation.navigateUp` incorrectly displays burger menu
我有一个 activity 设置为与 Android Jetpack 的 NavigationUI
一起使用。这很好用,我可以正确导航,除了如果我向下导航 2 次,当我向上导航一次时,应用栏将显示汉堡,即使 childFragmentManager
的后台堆栈中仍然有一个片段。
示例:
我导航到 动画中的爱丽丝 RSS 提要(这是一个 RSS reader),然后导航到 Love death & robots 提要的文章。然后返回文章列表。但我还没有在应用程序的顶部。这里应该没有汉堡菜单。
这是我的 activity class:
class MainActivity: AppCompatActivity() {
private val navigation: NavController by lazy {
Navigation.findNavController(this, R.id.main_activity_host_fragment)
}
private val drawerLayout by lazy {
findViewById<DrawerLayout>(R.id.activity_main_navigation_drawer)
}
private val drawerToggle by lazy {
ActionBarDrawerToggle(this, drawerLayout, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
}
private val appBarConfiguration by lazy {
AppBarConfiguration(navigation.graph, drawerLayout)
}
private val backstackCount inline get() = main_activity_host_fragment?.childFragmentManager?.backStackEntryCount ?: 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
drawerLayout.addDrawerListener(drawerToggle)
setupActionBarWithNavController(navigation, appBarConfiguration)
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
if(item?.itemId == android.R.id.home && backstackCount == 0) {
val isOpened = drawerLayout.isDrawerOpen(activity_main_navigation_view)
if(isOpened) drawerLayout.closeDrawers()
else drawerLayout.openDrawer(activity_main_navigation_view)
return true
}
return super.onOptionsItemSelected(item)
}
override fun onSupportNavigateUp(): Boolean {
val result = navigation.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
drawerToggle.syncState()
return result
}
}
这是我的导航图:
正如 ianhanniballake 评论的那样,NavigationUI
会自动处理主页按钮。 ActionBarDrawerToggle
不应与 AppBarConfiguration
一起使用。
我有一个 activity 设置为与 Android Jetpack 的 NavigationUI
一起使用。这很好用,我可以正确导航,除了如果我向下导航 2 次,当我向上导航一次时,应用栏将显示汉堡,即使 childFragmentManager
的后台堆栈中仍然有一个片段。
示例:
我导航到 动画中的爱丽丝 RSS 提要(这是一个 RSS reader),然后导航到 Love death & robots 提要的文章。然后返回文章列表。但我还没有在应用程序的顶部。这里应该没有汉堡菜单。
这是我的 activity class:
class MainActivity: AppCompatActivity() {
private val navigation: NavController by lazy {
Navigation.findNavController(this, R.id.main_activity_host_fragment)
}
private val drawerLayout by lazy {
findViewById<DrawerLayout>(R.id.activity_main_navigation_drawer)
}
private val drawerToggle by lazy {
ActionBarDrawerToggle(this, drawerLayout, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
}
private val appBarConfiguration by lazy {
AppBarConfiguration(navigation.graph, drawerLayout)
}
private val backstackCount inline get() = main_activity_host_fragment?.childFragmentManager?.backStackEntryCount ?: 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
drawerLayout.addDrawerListener(drawerToggle)
setupActionBarWithNavController(navigation, appBarConfiguration)
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
if(item?.itemId == android.R.id.home && backstackCount == 0) {
val isOpened = drawerLayout.isDrawerOpen(activity_main_navigation_view)
if(isOpened) drawerLayout.closeDrawers()
else drawerLayout.openDrawer(activity_main_navigation_view)
return true
}
return super.onOptionsItemSelected(item)
}
override fun onSupportNavigateUp(): Boolean {
val result = navigation.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
drawerToggle.syncState()
return result
}
}
这是我的导航图:
正如 ianhanniballake 评论的那样,NavigationUI
会自动处理主页按钮。 ActionBarDrawerToggle
不应与 AppBarConfiguration
一起使用。