我想更改与导航组件一起使用的ActionBar中的向上按钮图标。我尝试了几种选择,例如:
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_arrow_left_blue_24dp)
在MainAcitivty
或
app:navigationIcon="@drawable/ic_arrow_left_blue_24dp"
在Toolbar
.xml文件中,似乎没有任何作用。
我使用
进行了非常标准的设置setSupportActionBar(appToolbar.toolbar)
setupActionBarWithNavController(this, navController)
以MainActivity:onCreate
方法调用。
我希望
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_arrow_left_blue_24dp)
可行,因为例如通过调用以下内容来禁用ActionBar
的标题:
supportActionBar?.setDisplayShowTitleEnabled(false)
可以正常工作,并且导航时标题未设置为Fragment
名称。
此外,我进行了一些调查,在ActionBarOnDestinationChangedListener
中有一个对setNavigationIcon
的调用,该调用将一个图标设置为DrawerArrowDrawable
,这有点奇怪,因为我在我的设置中未使用Drawer
。
也更改为:
setupWithNavController(toolbar, navController)
不起作用,因为ToolbarOnDestinationChangedListener
也使用相同的DrawerArrowDrawable
。
答案 0 :(得分:1)
我找到了答案。我检查了导航组件的问题跟踪器,现在看来,如果没有解决方法,就无法更改它:
https://issuetracker.google.com/u/1/issues/121078028
很高兴仍然有可能,我们只需要实现OnDestinationChangedListener
并在那里更改图标,就象在setNavigationIcon
中的AbstractAppBarOnDestinationChangedListener
之后被调用一样。这是代码:
navController.addOnDestinationChangedListener { _, _, _ ->
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_arrow_left_blue_24dp)
}
您甚至可以为不同的目的地使用不同的图标。
这是临时解决方案,因为此功能尚不存在。我正在使用1.0.0-alpha09
版的导航组件。
答案 1 :(得分:0)
如果您不使用supportActionBar
,而是使用自己的工具栏界面,则解决方法如下。
navController.addOnDestinationChangedListener { _, destination, _ ->
if (destination.id == R.id.myDestination) {
myToolbar.setNavigationIcon(R.drawable.myIcon)
}
}
答案 2 :(得分:0)
您可以实现NavigationController.OnDestinationChangedListener
并使用Toolbar.setNavigationIcon
方法来设置图标。我建议使用AppBarConfiguration.topLevelDestinations
来确定您的目的地是否是顶级目的地,并相应地设置图标。 Kotlin
示例:
navController.addOnDestinationChangedListener { _, destination, _ ->
val isTopLevelDestination =
appBarConfiguration.topLevelDestinations.contains(destination.id)
toolbar.setNavigationIcon(
if(isTopLevelDestination) R.drawable.ic_menu else R.drawable.ic_back
)
}