Как изменить цвет стрелки назад в новой теме материала?
я обновил свой SDK до API 21, и теперь значок back/up-это черная стрелка, указывающая влево.
Я хотел бы, чтобы он был серый. Как я могу это сделать?
в магазине Play, например, стрелка белого цвета.
Я сделал это, чтобы установить некоторые стили. Я использовал @drawable/abc_ic_ab_back_mtrl_am_alpha
на homeAsUpIndicator
. Это рисование прозрачно (только альфа), но стрелка отображается черным цветом. Интересно, если я могу установить цвет, как я в DrawerArrowStyle
. Или если единственное решение-создать my @drawable/grey_arrow
и использовать его для homeAsUpIndicator
.
<!-- Base application theme -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="android:actionBarStyle" tools:ignore="NewApi">@style/MyActionBar</item>
<item name="actionBarStyle">@style/MyActionBar</item>
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
<item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
<item name="android:homeAsUpIndicator" tools:ignore="NewApi">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
</style>
<!-- ActionBar style -->
<style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">
<item name="android:background">@color/actionbar_background</item>
<!-- Support library compatibility -->
<item name="background">@color/actionbar_background</item>
</style>
<!-- Style for the navigation drawer icon -->
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@color/actionbar_text</item>
</style>
мое решение до сих пор принять @drawable/abc_ic_ab_back_mtrl_am_alpha
, который кажется белым, и нарисуйте его в цвете, который я хочу, используя редактор фотографий. Это работает, хотя я бы предпочел использовать @color/actionbar_text
как и в DrawerArrowStyle
.
20 ответов:
вы можете добиться этого с помощью кода. Получите рисование стрелки назад, измените ее цвет с помощью фильтра и установите ее как кнопку Назад.
final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP); getSupportActionBar().setHomeAsUpIndicator(upArrow);
пересмотр 1:
начиная с API 23 (Marshmallow) drawable resource
abc_ic_ab_back_mtrl_am_alpha
изменено наabc_ic_ab_back_material
.EDIT:
вы можете использовать этот код для достижения желаемых результатов:
toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.blue_gray_15), PorterDuff.Mode.SRC_ATOP);
смотреть на!--1--> и
TintManager
источникdrawable/abc_ic_ab_back_mtrl_am_alpha
- это тонировка со значением атрибута stylecolorControlNormal
.Я попытался установить это в моем проекте (с
<item name="colorControlNormal">@color/my_awesome_color</item>
в моей теме), но это все еще черный для меня.обновление:
нашли его. Вам нужно установить (не
actionBarStyle
) СcolorControlNormal
.например:
<style name="MyTheme" parent="Theme.AppCompat.Light"> <item name="actionBarTheme">@style/MyApp.ActionBarTheme</item> <item name="actionBarStyle">@style/MyApp.ActionBar</item> <!-- color for widget theming, eg EditText. Doesn't effect ActionBar. --> <item name="colorControlNormal">@color/my_awesome_color</item> <!-- The animated arrow style --> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> </style> <style name="MyApp.ActionBarTheme" parent="@style/ThemeOverlay.AppCompat.ActionBar"> <!-- THIS is where you can color the arrow! --> <item name="colorControlNormal">@color/my_awesome_color</item> </style> <style name="MyApp.ActionBarStyle" parent="@style/Widget.AppCompat.Light.ActionBar"> <item name="elevation">0dp</item> <!-- style for actionBar title --> <item name="titleTextStyle">@style/ActionBarTitleText</item> <!-- style for actionBar subtitle --> <item name="subtitleTextStyle">@style/ActionBarSubtitleText</item> <!-- the actionBarTheme doesn't use the colorControlNormal attribute <item name="colorControlNormal">@color/my_awesome_color</item> --> </style>
пробовал все предложения выше. Единственный способ, которым мне удалось изменить цвет значка навигации по умолчанию кнопка Назад стрелка в моей панели инструментов, чтобы установить colorControlNormal в базовой теме, Как это. Вероятно, из-за того, что родитель использует тему.Совместимости приложений.Свет.NoActionBar
<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorControlNormal">@color/white</item> //the rest of your codes... </style>
нужно добавить один атрибут в тему панели инструментов -
<style name="toolbar_theme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <item name="colorControlNormal">@color/arrow_color</item> </style>
применить эту toolbar_theme к панели инструментов.
или
вы можете напрямую обратиться к вашей теме -
<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorControlNormal">@color/arrow_color</item> //your code .... </style>
Как сказано в большинстве предыдущих комментариев, решение состоит в том, чтобы добавить
<item name="colorControlNormal">@color/white</item>
к вашей теме приложения. Но убедитесь, что у вас нет другой темы, определенной в элементе панели инструментов на вашем макете.<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:elevation="4dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
при использовании
Toolbar
,вы можете попробовать этотDrawable drawable = toolbar.getNavigationIcon(); drawable.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);
ответ Карлеса является правильным ответом, но немногие из методов, таких как getDrawable (), getColor () стал устаревшим в то время, когда я пишу этот ответ. Так что обновленный ответ будет
Drawable upArrow = ContextCompat.getDrawable(context, R.drawable.abc_ic_ab_back_mtrl_am_alpha); upArrow.setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP); getSupportActionBar().setHomeAsUpIndicator(upArrow);
после некоторых других запросов stackoverflow я обнаружил, что вызов ContextCompat.getDrawable() похож на
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { return resources.getDrawable(id, context.getTheme()); } else { return resources.getDrawable(id); }
и ContextCompat.getColor () аналогично
public static final int getColor(Context context, int id) { final int version = Build.VERSION.SDK_INT; if (version >= 23) { return ContextCompatApi23.getColor(context, id); } else { return context.getResources().getColor(id); } }
на compileSdkVersoin 25, вы можете сделать это:
стили.xml
<style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:textColorSecondary">@color/your_color</item> </style>
Изменить Цвет Значка Меню Nav
в стиле.XML-код :
<style name="MyMaterialTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="windowNoTitle">true</item> <item name="windowActionBar">false</item> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> <item name="android:textColor">@color/colorAccent</item> </style> <style name="DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@color/colorPrimaryDark</item> </style> In Mainfests.xml : <activity android:name=".MainActivity" android:theme="@style/MyMaterialTheme.Base"></activity>
Я нашел решение, которое работает предварительно леденец. Установите " colorControlNormal "в" actionBarWidgetTheme", чтобы изменить цвет homeAsUpIndicator. Изменение ответа rockgecko сверху, чтобы выглядеть так:
<style name="MyTheme" parent="Theme.AppCompat.Light"> <item name="actionBarTheme">@style/MyApp.ActionBarTheme</item> <item name="actionBarStyle">@style/MyApp.ActionBar</item> <!-- color for widget theming, eg EditText. Doesn't effect ActionBar. --> <item name="colorControlNormal">@color/my_awesome_color</item> <!-- The animated arrow style --> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> <!-- The style for the widgets on the ActionBar. --> <item name="actionBarWidgetTheme">@style/WidgetStyle</item> </style> <style name="WidgetStyle" parent="style/ThemeOverlay.AppCompat.Light"> <item name="colorControlNormal">@color/my_awesome_color</item> </style>
использовать ниже метод:
private Drawable getColoredArrow() { Drawable arrowDrawable = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); Drawable wrapped = DrawableCompat.wrap(arrowDrawable); if (arrowDrawable != null && wrapped != null) { // This should avoid tinting all the arrows arrowDrawable.mutate(); DrawableCompat.setTint(wrapped, Color.GRAY); } return wrapped; }
теперь вы можете установить drawable с:
getSupportActionBar().setHomeAsUpIndicator(getColoredArrow());
другое решение, которое может работать для вас, - это не объявлять панель инструментов в качестве панели действий приложения ( by
setActionBar
илиsetSupportActionBar
) и установите значок назад в вашем onActivityCreated, используя код, упомянутый в другом ответе на этой страницеfinal Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP); toolbar.setNavigationIcon(upArrow);
теперь, вы не получите
onOptionItemSelected
обратный вызов при нажатии кнопки Назад. Однако вы можете зарегистрироваться для этого с помощьюsetNavigationOnClickListener
. Вот что я делаю:toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { getActivity().onBackPressed(); //or whatever you used to do on your onOptionItemSelected's android.R.id.home callback } });
Я не уверен, если это будет работать, если вы работаете с меню.
мы столкнулись с той же проблемой и все, что мы хотели установить
app: collapseIcon
атрибут на панели инструментов в конце концов, который мы не нашли, так как он не очень хорошо документирован :)
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="@dimen/toolbarHeight" app:collapseIcon="@drawable/collapseBackIcon" />
попробуй такое
public void enableActionBarHomeButton(AppCompatActivity appCompatActivity, int colorId){ final Drawable upArrow = ContextCompat.getDrawable(appCompatActivity, R.drawable.abc_ic_ab_back_material); upArrow.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP); android.support.v7.app.ActionBar mActionBar = appCompatActivity.getSupportActionBar(); mActionBar.setHomeAsUpIndicator(upArrow); mActionBar.setHomeButtonEnabled(true); mActionBar.setDisplayHomeAsUpEnabled(true); }
вызов функции:
enableActionBarHomeButton(this, R.color.white);
вы можете изменить цвет значка навигации программно такой:
mToolbar.setNavigationIcon(getColoredArrow()); private Drawable getColoredArrow() { Drawable arrowDrawable = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); Drawable wrapped = DrawableCompat.wrap(arrowDrawable); if (arrowDrawable != null && wrapped != null) { // This should avoid tinting all the arrows arrowDrawable.mutate(); DrawableCompat.setTintList(wrapped, ColorStateList.valueOf(this.getResources().getColor(R.color.your_color))); } } return wrapped; }
просто удалить
android:homeAsUpIndicator
иhomeAsUpIndicator
из вашей темы и все будет хорошо. Элемент в своемDrawerArrowStyle
стиль должен быть достаточно.
Если вы хотите изменить цвет кнопки со стрелкой для всех значков в вашей теме просто переопределить файл по умолчанию в папке drawable. Имя файла по умолчанию - "abc_ic_ab_back_mtrl_am_alpha.формат PNG."
Я только что изменил тему панели инструментов, чтобы быть @style / ThemeOverlay.Совместимости приложений.Свет
и Стрелка стала темно-серой
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:gravity="center" app:layout_collapseMode="pin" app:theme="@style/ThemeOverlay.AppCompat.Light">