2014-12-02 2 views
2

Я работаю над переносом существующей действующей панели действий на Toolbar, и у меня возникла небольшая проблема. Обычно я хочу иметь значок навигации со стандартной белой стрелкой назад. Однако в некоторых случаях я хочу изменить эту стрелку на серый. Для этого я делаю следующее.Цвет панели инструментов AppCompatControlNormal получает кеширование

<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. Каков наилучший способ исправить это?

ответ

2

Почему это происходит?

вводимых коэффициент разделяет ConstantState при создании из ресурса и AppCompat использует setColorFilter для портировать расцветку. Итак, когда вы открываете новое действие, TintManager устанавливает ColorFilter в 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()

+0

Одно маленькое дополнение к этому: в чтобы сделать эту работу с e standard icon (R.drawable.abc_ic_ab_back_mtrl_am_alpha) Мне нужно обновить оттенок значка с помощью TintManager.getDrawable() в 'onRestart'. Я не большой поклонник этого, учитывая, что TintManager находится во внутреннем пакете; есть ли какой-либо путь вокруг этого? – Jonathan

+1

@Jonathan Проверьте https://code.google.com/p/android/issues/detail?id=78289. Похоже, он исправлен, но еще не выпущен. –

Смежные вопросы