Как изменить цвет стрелки назад в новой теме материала?
Я обновил свой SDK до API 21, и теперь значок назад/вверх - это черная стрелка, указывающая влево.
![Black back arrow]()
Я хотел бы, чтобы он был серым. Как я могу это сделать?
В Play Store, например, стрелка белая.
Я сделал это, чтобы установить некоторые стили. Я использовал @drawable/abc_ic_ab_back_mtrl_am_alpha
для homeAsUpIndicator
. Этот drawable прозрачен (только альфа), но стрелка отображается черным цветом. Интересно, могу ли я установить цвет, как я делаю в DrawerArrowStyle
. Или единственное решение - создать мой @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
.
Ответы
Ответ 1
Вы можете добиться этого с помощью кода. Получите обратную стрелку для рисования, измените ее цвет с помощью фильтра и установите его как кнопку возврата.
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) ресурс abc_ic_ab_back_mtrl_am_alpha
, который выбивается, изменяется на abc_ic_ab_back_material
.
Ответ 2
При взгляде на источник Toolbar
и TintManager
drawable/abc_ic_ab_back_mtrl_am_alpha
отображается значение атрибута style colorControlNormal
.
Я попытался установить это в своем проекте (с <item name="colorControlNormal">@color/my_awesome_color</item>
в моей теме), но он по-прежнему черный для меня.
Обновление
Нашел. Вам нужно установить атрибут actionBarTheme
( не 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>
Ответ 3
Пробовал все предложения выше. Единственный способ, которым мне удалось изменить цвет значка навигации по умолчанию. Кнопка "Назад" на моей панели инструментов - это установить colorControlNormal в базовой теме, подобной этой. Вероятно, из-за того, что родитель использует Theme.AppCompat.Light.NoActionBar
<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorControlNormal">@color/white</item>
//the rest of your codes...
</style>
Ответ 4
Вам нужно добавить один атрибут в тему своей панели инструментов -
<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>
Ответ 5
Просто добавьте
<item name="colorControlNormal">@color/white</item>
в вашу текущую тему приложения.
Ответ 6
Как отмечалось в большинстве предыдущих комментариев, решение состоит в том, чтобы добавить
<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" />
Ответ 7
если вы используете Toolbar
, вы можете попробовать это
Drawable drawable = toolbar.getNavigationIcon();
drawable.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);
Ответ 8
Ответ Карлеса - правильный ответ, но лишь немногие из таких методов, как 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);
}
}
Ссылка 1: ContextCompat.getDrawable()
Ссылка 2: ContextCompat.getColor()
Ответ 9
В compileSdkVersoin 25 вы можете сделать следующее:
styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="android:textColorSecondary">@color/your_color</item>
</style>
Ответ 10
Я нашел решение, которое работает до Lollipop. Установите "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>
Ответ 11
![введите описание изображения здесь]()
Изменить меню Цвет значка навигации
![Окончательное преобразование значка значка меню]()
В style.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>
Ответ 12
Используйте метод ниже:
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());
Ответ 13
Еще одно решение, которое может сработать для вас, - не объявлять свою панель инструментов как панель действий приложения (через 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 android.R.id.home callback
}
});
Я не уверен, что это сработает, если вы работаете с элементами меню.
Ответ 14
попробуйте это
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);
Ответ 15
Просто удалите android:homeAsUpIndicator
и homeAsUpIndicator
из своей темы, и все будет хорошо. Атрибут color
в вашем стиле DrawerArrowStyle
должен быть достаточным.
Ответ 16
Если вы хотите изменить цвет кнопки со стрелкой для всех значков в своей теме, просто переопределите файл по умолчанию в вашей папке с возможностью копирования. Имя файла по умолчанию: "abc_ic_ab_back_mtrl_am_alpha.png".
Ответ 17
Мы столкнулись с той же проблемой, и все, что мы хотели, это установить
Приложение: collapseIcon
на панели инструментов в конце, который мы не нашли, поскольку он не очень хорошо документирован:)
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbarHeight"
app:collapseIcon="@drawable/collapseBackIcon" />
Ответ 18
Вы можете изменить цвет значка навигации программно следующим образом:
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;
}
Ответ 19
Я просто изменил тему панели инструментов на @style/ThemeOverlay.AppCompat.Light
и стрелка стала темно-серой
<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">
Ответ 20
Если нет лучшего решения...
Я сделал, чтобы взять @drawable/abc_ic_ab_back_mtrl_am_alpha
изображения, которые кажутся белыми, и нарисовать их в цвете, который я хочу, используя редактор фотографий.