导航组件,如何在导航抽屉中显示正常的向上/向后按钮,而不是汉堡图标 [英] Navigation Component, how to show a normal UP/back button instead of hamburger icon in Navigation Drawer

本文介绍了导航组件,如何在导航抽屉中显示正常的向上/向后按钮,而不是汉堡图标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

我最初的想法是在导航到NutrientFragment时将布尔值作为参数传递,在onCreateView()中,根据布尔值的值,删除汉堡图标或添加Back按钮。但这似乎有点丑陋和低效,特别是如果我在未来添加更多可能有同样问题的目的地。我也不知道如何删除汉堡图标并替换为普通的后退按钮。有没有关于如何实施的想法?我找到的所有答案要么是用旧的过时Java代码编写的,要么不完全是我要找的。

谢谢。

推荐答案

我设法找到了解决方案。我将此变量添加到MainActivity:

// If true, disable drawer and enable back/up button
private var isUpButton = false

和这些方法:

// Disable drawer and enable the up button
fun useUpButton() {
    supportActionBar?.setHomeAsUpIndicator(
        androidx.appcompat.R.drawable.abc_ic_ab_back_material
    )
    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
    isUpButton = true
}

// Enable the drawer and disable up button
private fun useHamburgerButton() {
    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
    isUpButton = false
}

useUpButton()用默认的向上图标替换汉堡图标,锁定抽屉滑块并将isUpButton设置为true。我还覆盖了On OptionsItemsSelected:

// If isUpButton is true, and the home button is clicked, navigate up and
// enable drawer again, if false, just normal drawer behaviour
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return if (isUpButton && item.itemId == android.R.id.home) {
        navController.navigateUp()
        useHamburgerButton()
        true
    } else super.onOptionsItemSelected(item)
}

因此,如果单击主页按钮(汉堡图标或向上图标),并将isUpButton设置为true,则该活动将向上导航,就像正常的向上行为一样,并将isUpButton重置为false,以便其他片段可以再次使用该抽屉。

现在我需要做的就是使用这些方法来解决我的问题:我希望NutrientFragment仅在我没有使用抽屉导航到NutrientFragment时才显示向上按钮&q;。为此,我需要在nav_raph.xml上创建NutrientFragment目标的参数:

<fragment
    android:id="@+id/nutrientFragment"
    android:name="com.example.elegantcalorietracker.ui.fragments.NutrientFragment"
    android:label="@string/nutrients"
    tools:layout="@layout/fragment_nutrient">
    <action
        android:id="@+id/action_nutrientFragment_to_trackerFragment"
        app:destination="@id/trackerFragment" />
    <argument
        android:name="upButtonNeeded"
        android:defaultValue="false"
        app:argType="boolean" />

并将此代码添加到NutrientFragment的onCreateView()方法:

upButtonNeeded = arguments?.getBoolean("upButtonNeeded") ?: false
if (upButtonNeeded) {
    (activity as MainActivity).useUpButton()
}

现在,如果我在导航到NutrientFragment的另一个片段中有一个按钮,我所需要做的就是将true作为参数传递给导航方法:

val argument = bundleOf("upButtonNeeded" to true)
this@TrackerFragment
     .findNavController()
     .navigate(
         R.id.action_trackerFragment_to_nutrientFragment,
         argument
     )

结果:

使用抽屉导航到NutrientFragment时,汉堡包图标正常显示,但是当以另一种方式导航(如按钮)时,向上按钮显示为:

这篇关于导航组件,如何在导航抽屉中显示正常的向上/向后按钮,而不是汉堡图标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆