单击抽屉后如何继续显示汉堡包图标而不是后退/向上图标?

Her*_*man 3 android android-navigation android-architecture-navigation

我正在关注 Codelab https://developer.android.com/codelabs/kotlin-android-training-add-navigation/index.html#9,并使用以下代码来连接抽屉:

class MainActivity : AppCompatActivity() {

    private lateinit var drawerLayout : DrawerLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        @Suppress("UNUSED_VARIABLE")
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        drawerLayout = binding.drawerLayout

        val navController = findNavController(R.id.myNavHostFragment)
        // To support up action and also the title, the third parameter is optional and is used
        // for the hamburger menu for drawer.
        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)

        // show the navigation drawer
        NavigationUI.setupWithNavController(binding.navView, navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.myNavHostFragment)

        // this is for the hamburger menu
        return NavigationUI.navigateUp(navController, drawerLayout)
    }
}
Run Code Online (Sandbox Code Playgroud)

当显示初始片段时,汉堡包将按预期显示:

初始片段

但是,当我从抽屉中选择其中一项(例如“关于”)后,它就变成了后退/向上按钮:

在此输入图像描述

如何继续使用汉堡按钮而不是将其更改为向上按钮?

Codelab 的完整代码位于:https://github.com/google-developer-training/android-kotlin-fundamentals-apps/tree/master/AndroidTriviaNavigation

ian*_*ake 7

根据AppBarConfiguration 文档

\n
\n

NavigationUI使用AppBarConfiguration 对象来管理应用程序显示区域左上角的导航按钮的行为。导航按钮\xe2\x80\x99 的行为会根据用户是否位于顶级目的地而变化。

\n

顶级目标是一组分层相关目标中的根或最高级别目标。顶级目标不会在顶部应用栏中显示向上按钮,因为没有更高级别的目标。默认情况下,应用程序的启动目的地是唯一的顶级目的地。

\n

当用户位于顶级目的地时,如果该目的地使用 DrawerLayout,则导航按钮将变为抽屉图标。如果目标不使用 DrawerLayout,则导航按钮将被隐藏。当用户位于任何其他目的地时,导航按钮将显示为向上按钮。

\n
\n

因此,如果您希望抽屉图标出现在多个目标上,而不仅仅是起始目标上,则需要创建一个AppBarConfiguration对象,其中包含您希望成为顶级目标的目标:

\n
// Use the IDs from your navigation graph\nval appBarConfiguration = AppBarConfiguration(\n    setOf(R.id.rulesFragment, R.id.aboutFragment),\n    drawerLayout)\n
Run Code Online (Sandbox Code Playgroud)\n

因此,您的代码将变为:

\n
class MainActivity : AppCompatActivity() {\n\n    private lateinit var appBarConfiguration : AppBarConfiguration\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        @Suppress("UNUSED_VARIABLE")\n        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)\n        // Use the Kotlin extension in navigation-ui-ktx to create\n        // the AppBarConfiguration\n        appBarConfiguration = AppBarConfiguration(\n            setOf(R.id.rulesFragment, R.id.aboutFragment),\n            binding.drawerlayout)\n\n        val navController = findNavController(R.id.myNavHostFragment)\n        // To support up action and also the title, the third parameter is optional and is used\n        // for the hamburger menu for drawer.\n        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)\n\n        // show the navigation drawer\n        NavigationUI.setupWithNavController(binding.navView, navController)\n    }\n\n    override fun onSupportNavigateUp(): Boolean {\n        val navController = findNavController(R.id.myNavHostFragment)\n\n        // this is for the hamburger menu\n        return NavigationUI.navigateUp(navController, appBarConfiguration)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 谢谢。看起来传入抽屉布局只是将AppBarConfiguration与抽屉布局和navController的起始目的地一起使用的快捷方式,因此定义AppBarConfiguration可以自己指定顶级目的地。 (2认同)