android - AppCompat 工具栏的 colorControlNormal 正在被缓存

标签 android android-layout android-appcompat

我正在努力将现有的操作栏迁移到工具栏,但遇到了一个小问题。通常我想要一个带有标准白色后箭头的导航图标。但是,在某些情况下,我想将该箭头更改为灰色。为了实现这一目标,我执行以下操作。

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?actionBarSize"
    android:background="?titlebarBackground"
    style="?actionBarStyle"
    app:navigationIcon="@drawable/action_bar_up_arrow"
    app:theme="?toolbarTheme"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

通常我将?toolbarTheme设置为@style/ThemeOverlay.AppCompat.Dark.ActionBar。然后,如果我想要一个灰色的向上箭头,我将主题设置为。

<style name="ThemeOverlay.AppCompat.Dark.ActionBar.GrayControls">
    <item name="colorControlNormal">@color/gray</item>
</style>

这最初工作完美,我的向上箭头变为灰色。但是,当我返回时,返回堆栈上所有 Activity 的向上箭头仍然保留灰色。如果我打开一个新的Activity,箭头将更改为白色,但任何以前的 Activity 的箭头仍设置为灰色。

我的问题有两个:

  1. 为什么会发生这种情况?
  2. 解决这个问题的最佳方法是什么?

最佳答案

Why is this happening?

Drawables 共享 ConstantState当从资源创建且 AppCompat 使用 setColorFilter 时向后移植着色。因此,当您打开一个新 Activity 时,TintManager在 Drawable 上设置一个 ColorFilter,它会更新该 Drawable 的所有实例。

What's the best way to fix it?

如果您想让此可绘制对象可更新而不影响其他实例,则必须使用 drawable.mutate() 改变现有的常量状态

这个问题确实应该在图书馆中得到解决。 编辑: It has been fixed internally .

对于脏修复,请在 onResume() 中执行此操作

toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

更多信息:

https://code.google.com/p/android/issues/detail?id=78289

http://www.curious-creature.com/2009/05/02/drawable-mutations/

http://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate()

关于android - AppCompat 工具栏的 colorControlNormal 正在被缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260859/

相关文章:

android - colorButtonNormal没有效果?

java - 由 : java. lang.IllegalStateException 引起:应为字符串但为 BEGIN_OBJECT

java - 如何以编程方式在android中创建checkedtextview?

android - 使用 fragment 时 viewModelFactory 变量尚未初始化

python - 如何将卡住图转换为 TensorFlow lite

Android,findViewById 返回 null

Android:GridLayout 的分隔线

android - 如何使 dialogFragment 宽度与父级匹配?

android - 在 Android Studio 中添加 AppCompat v7 后出错

android - 我可以在 android.support.v7.widget.Toolbar 的溢出菜单上使用 actionLayout 吗?