如何在Toolbar左侧添加自定义按钮 替代首页空白与返回箭头
实现方案
你可以通过动态切换Toolbar的导航图标实现需求,不需要固定返回箭头或者留空,只需在Fragment切换时同步修改Toolbar的配置即可,具体操作如下:
步骤1:准备自定义图标资源
将首页需要显示的自定义按钮图标放入项目res/drawable目录下,例如命名为ic_custom_menu.xml。
步骤2:动态修改Toolbar导航配置
有两种常用实现方式,可根据你的项目结构选择:
- 方式一:在宿主Activity中统一监听Fragment栈变化
在宿主Activity的onCreate方法中添加回退栈监听,根据当前显示的Fragment修改Toolbar配置:supportFragmentManager.addOnBackStackChangedListener { val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) val toolbar = findViewById<Toolbar>(R.id.toolbar) when(currentFragment) { is FirstFragment -> { // 首页显示自定义图标 toolbar.setNavigationIcon(R.drawable.ic_custom_menu) toolbar.setNavigationOnClickListener { // 此处写自定义按钮的点击逻辑,例如打开侧边抽屉 openDrawerLayout() } } is SecondFragment -> { // 二级页显示返回箭头 toolbar.setNavigationIcon(android.R.drawable.ic_menu_revert) toolbar.setNavigationOnClickListener { // 此处写返回逻辑,弹出Fragment回退栈 supportFragmentManager.popBackStack() } } } } - 方式二:在各Fragment中独立配置
如果你不想在Activity中统一处理,可以分别在两个Fragment的onResume生命周期中修改Toolbar:
首页FirstFragment的代码:
二级页SecondFragment的代码:override fun onResume() { super.onResume() val toolbar = requireActivity().findViewById<Toolbar>(R.id.toolbar) toolbar.setNavigationIcon(R.drawable.ic_custom_menu) toolbar.setNavigationOnClickListener { // 自定义按钮点击逻辑 } }override fun onResume() { super.onResume() val toolbar = requireActivity().findViewById<Toolbar>(R.id.toolbar) toolbar.setNavigationIcon(android.R.drawable.ic_menu_revert) toolbar.setNavigationOnClickListener { parentFragmentManager.popBackStack() } }
注意事项
- 若你已将Toolbar设置为Activity的ActionBar,可通过
supportActionBar?.setHomeAsUpIndicator()修改图标,同时需保证supportActionBar?.setDisplayHomeAsUpEnabled(true)开启图标显示。 - 若项目使用Navigation组件,可直接监听
OnDestinationChangedListener,在页面切换时修改导航图标即可。 - 不要在Toolbar的XML布局中固定写
app:navigationIcon属性,避免动态修改被静态配置覆盖。
两个页面对比效果如下图:
内容的提问来源于stack exchange,提问作者yaromchikV
相关产品推荐
相关产品推荐

