AppCompat工具栏的colorControlNormal正在缓存

时间:2014-12-02 23:18:25

标签: android android-layout android-appcompat

我正在努力将我们已有的Action Bar迁移到Toolbar,我遇到了一个小问题。通常我想要一个带有标准白色后箭头的导航图标。但是,在某些情况下,我想将该箭头更改为灰色。为此,我做了以下几点。

<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,箭头会变为白色,但之前的所有活动仍将其箭头设置为灰色。

我的问题有两个:

  1. 为什么会这样?
  2. 解决问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

  

为什么会这样?

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

  

解决问题的最佳方法是什么?

如果要在不影响其他实例的情况下使此drawable可更新,则必须使用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()