我正在努力将我们已有的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
,箭头会变为白色,但之前的所有活动仍将其箭头设置为灰色。
我的问题有两个:
答案 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()