首页 > 解决方案 > 导航组件,如何在导航抽屉中显示正常的向上/后退按钮而不是汉堡图标

问题描述

我的活动中有三个顶级目标片段:

appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.trackerFragment,
            R.id.nutrientFragment,
            R.id.settingsFragment
        ),
        drawerLayout
    )

这意味着所有这些片段都将显示汉堡按钮而不是正常的后退箭头。问题是我的应用程序中有一个“Go to Nutrient”按钮,该按钮导航到 NutrientFragment,这是一个顶级目的地。我希望这个片段在使用抽屉导航时仍然显示汉堡包图标,但在导航“转到营养”按钮时显示正常的后退/向上按钮。

我最初的想法是在导航到时传递一个布尔值作为参数NutrientFragment,并且在内部onCreateView(),根据布尔值,删除汉堡图标或添加后退按钮。但这似乎有点丑陋和低效,特别是如果将来我添加更多可能有同样问题的目的地。我也不知道如何“删除汉堡包图标并用正常的后退按钮替换”。关于如何实施的任何想法?我找到的所有答案都在旧的不推荐使用的 java 代码中,或者不是我正在寻找的。

谢谢。

标签: androidkotlinnavigation-drawerandroid-architecture-componentsandroid-navigation

解决方案


鉴于:

现在您有了一个包含三个片段(trackerFragment、nutritorFragment 和 settingsFragment)的导航抽屉。

appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.trackerFragment,
            R.id.nutrientFragment,
            R.id.settingsFragment
        ),
        drawerLayout
    )

必需的:

您希望将汉堡保留在主片段 ( NutrientFragment) 中,并用 UP 按钮替换某些片段。

解决方案:

假设这settingsFragment是片段,您需要使用 UP 按钮而不是汉堡。

首先从以下片段中删除此片段appBarConfiguration

appBarConfiguration = AppBarConfiguration(
    setOf(
        R.id.trackerFragment, R.id.nutrientFragment
    ), drawerLayout
)

然后,为了控制Burger按钮,您需要同步抽屉布局和SupportActionBarwith an ActionBarDrawerToggle,这是一个方法:

fun getActionBarDrawerToggle(
    drawerLayout: DrawerLayout,
    toolbar: Toolbar
): ActionBarDrawerToggle {
    val toggle = ActionBarDrawerToggle(
        this,
        drawerLayout,
        toolbar,
        R.string.open,
        R.string.close
    )
    drawerLayout.addDrawerListener(toggle)
    toggle.syncState()
    return toggle
}

R.string.open&R.string.close是符号字符串,您可以在 strings.xml 中创建它们:

<resources>
    <string name="open">Open</string>
    <string name="close">Close</string>
</resources>

是从布局膨胀并toolBar设置为的工具supportActionBarsetSupportActionBar()

然后,向导航添加一个侦听器以检测何时settingFragment选择了 ,以便您可以使用以下方法禁用汉堡的切换功能toggle.isDrawerIndicatorEnabled

val toggle = getActionBarDrawerToggle(drawerLayout, toolbar) // replace  the `drawerLayout` & `toolbar` according to yours
navController.addOnDestinationChangedListener { _, destination, _ ->
    if (destination.id == R.id.settingsFragment)
        toggle.isDrawerIndicatorEnabled = false
}

当然,现在 UP 按钮在您单击它时将不起作用,要解决此问题,我们需要 setToolbarNavigationClickListener启用切换功能并导航回 Home 片段(假设 home 片段是nutrientFragment):

toggle.setToolbarNavigationClickListener {
    toggle.isDrawerIndicatorEnabled = true
    navController.navigate(R.id.nutrientFragment)
}

预览:

这里的 Gallery 片段是放置 UP 按钮的位置:


推荐阅读