android - 导航组件,如何在导航抽屉中显示正常的向上/后退按钮而不是汉堡图标
问题描述
我的活动中有三个顶级目标片段:
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.trackerFragment,
R.id.nutrientFragment,
R.id.settingsFragment
),
drawerLayout
)
这意味着所有这些片段都将显示汉堡按钮而不是正常的后退箭头。问题是我的应用程序中有一个“Go to Nutrient”按钮,该按钮导航到 NutrientFragment,这是一个顶级目的地。我希望这个片段在使用抽屉导航时仍然显示汉堡包图标,但在导航“转到营养”按钮时显示正常的后退/向上按钮。
我最初的想法是在导航到时传递一个布尔值作为参数NutrientFragment
,并且在内部onCreateView()
,根据布尔值,删除汉堡图标或添加后退按钮。但这似乎有点丑陋和低效,特别是如果将来我添加更多可能有同样问题的目的地。我也不知道如何“删除汉堡包图标并用正常的后退按钮替换”。关于如何实施的任何想法?我找到的所有答案都在旧的不推荐使用的 java 代码中,或者不是我正在寻找的。
谢谢。
解决方案
鉴于:
现在您有了一个包含三个片段(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按钮,您需要同步抽屉布局和SupportActionBar
with 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
设置为的工具supportActionBar
栏setSupportActionBar()
然后,向导航添加一个侦听器以检测何时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 按钮的位置:
推荐阅读
- jquery - 使用 webpacker 和 coffeescript 未触发 jquery 事件
- excel - Excel VBA函数返回一个工作链接到文书工作
- xamarin - 在 ListView(Xamarin Forms)上滚动项目时如何计算位置值(高度)?
- c - 如何将复数(复整数)与C中的整数相乘?
- linux - group 的所有命令都应该成功或没有
- docker - 使用 docker-compose 和自定义 Dockerfile 挂载目录为空
- react-native - 列表项的背景颜色不起作用?
- html - 图片未显示在 div 中
- r - 使用 Rcpp 公开 C 结构?
- flutter - 无法在 Appbar 操作小部件 onPress 触发器内显示快餐栏