【问题标题】:Is it possible to change up button icon in Navigation Component?是否可以更改导航组件中的向上按钮图标?
【发布时间】:2019-06-11 13:37:41
【问题描述】:

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

【问题讨论】:

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


    【解决方案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 版本的导航组件。

    【讨论】:

      【解决方案2】:

      如果你不使用supportActionBar,而是使用自己的工具栏,解决方法如下。

      navController.addOnDestinationChangedListener { _, destination, _ ->
      
              if (destination.id == R.id.myDestination) {
      
                  myToolbar.setNavigationIcon(R.drawable.myIcon)
              }
      }
      

      【讨论】:

        【解决方案3】:

        您可以实现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
            )
        }
        

        【讨论】:

          猜你喜欢
          • 2011-04-04
          • 1970-01-01
          • 1970-01-01
          • 2021-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-30
          • 1970-01-01
          相关资源
          最近更新 更多