it-swarm.com.ru

Как изменить цвет стрелки назад в новой теме материала?

Я обновил свой SDK до API 21, и теперь значок возврата/вверх - черная стрелка, указывающая влево.

Black back arrow

Я хотел бы, чтобы это было серым. Как я могу это сделать?

Например, в магазине Play Store стрелка белого цвета.

Я сделал это, чтобы установить некоторые стили. Я использовал @drawable/abc_ic_ab_back_mtrl_am_alpha для homeAsUpIndicator. Этот чертеж является прозрачным (только альфа), но стрелка отображается черным цветом. Интересно, могу ли я установить цвет, как я делаю в 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.

170
Ferran Maylinch

Вы можете достичь этого с помощью кода. Получите рисованную стрелку назад, измените ее цвет с помощью фильтра и установите ее в качестве кнопки возврата.

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.

Правка:

Вы можете использовать этот код для достижения желаемых результатов:

toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.blue_gray_15), PorterDuff.Mode.SRC_ATOP);
317
Carles

Если посмотреть на источники Toolbar и TintManager, то drawable/abc_ic_ab_back_mtrl_am_alpha окрашивается значением атрибута стиля colorControlNormal.

Я попытался установить это в своем проекте (с <item name="colorControlNormal">@color/my_awesome_color</item> в моей теме), но он все еще черный для меня.

Обновление :

Нашел это. Вам необходимо установить атрибут actionBarTheme ( not 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>
186
rockgecko

Перепробовал все предложения выше. Единственный способ, которым мне удалось изменить цвет значка навигации по умолчанию - кнопка со стрелкой «Назад» на моей панели инструментов - это установить 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>
108
Harry Aung

Необходимо добавить один атрибут в тему панели инструментов - 

<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>
57
Neo

Просто добавь 

<item name="colorControlNormal">@color/white</item> 

к вашей текущей теме приложения.

43
S bruce

Как сказано в большинстве предыдущих комментариев, решение состоит в том, чтобы добавить 

<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" />
30
manuelvsc

если использовать Toolbar, вы можете попробовать это

Drawable drawable = toolbar.getNavigationIcon();
drawable.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);
27
longbaobao

Ответ Карлеса является правильным, но немногие из методов, таких как 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);

Следуя некоторым другим запросам стекопотока, я обнаружил, что вызов 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 ()

10
capt.swag

Я нашел решение, которое работает до 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>
7
GFred

На compileSdkVersoin 25 вы можете сделать это:

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light">
     <item name="Android:textColorSecondary">@color/your_color</item>
</style>
6
nuttynibbles

Используйте метод ниже:

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;
}

Теперь вы можете установить рисование с помощью:

getSupportActionBar().setHomeAsUpIndicator(getColoredArrow());
5
Jumpa

 enter image description here

Изменить цвет значка меню навигации

 Final convert Menu Icon Color

В 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>
5
Sumit Saxena

Другое решение, которое может работать для вас, это не объявлять вашу панель инструментов как панель действий приложения (с помощью 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
    }
});

Я не уверен, будет ли это работать, если вы работаете с пунктами меню. 

4
Vinay Wadhwa

попробуй это

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);
1
Siddarth Kanted

Мы столкнулись с той же проблемой, и все, что мы хотели, это установить 

приложение: collapseIcon

атрибут на панели инструментов в конце концов, который мы не нашли, так как он не очень хорошо задокументирован :)

<Android.support.v7.widget.Toolbar
         Android:id="@+id/toolbar"
         Android:layout_width="match_parent"
         Android:layout_height="@dimen/toolbarHeight"
         app:collapseIcon="@drawable/collapseBackIcon" />
1
Julian Horst

Вы можете изменить цвет значка навигации программно следующим образом:

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;
}
0
pks

Я просто изменил тему панели инструментов на @ 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">
0
fullMoon

Простое решение, которое сработало для меня (если вам нужно использовать один и тот же цвет стрелки во всем приложении):

  1. Сохраните значок стрелки, который вы хотите использовать, в папку для рисования (убедитесь, что она имеет желаемый цвет; вы можете изменить свой цвет в xml, если вы используете векторное изображение xml).

  2. Назначьте этот новый значок стрелки на панель действий:

    ActionBar actionBar = getSupportActionBar (); ActionBar.setHomeAsUpIndicator (R.drawable.ic_your_icon_here);

0
evanca