是否可以在导航组件中更改向上按钮图标?

时间:2019-01-17 11:02:02

标签: android android-navigation android-jetpack android-architecture-navigation

我想更改与导航组件一起使用的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

3 个答案:

答案 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
    )
}