Comment changer la couleur de la flèche arrière dans le nouveau thème matériel?

j'ai mis à jour mon SDK EN API 21 et maintenant l'icône back/up est une flèche noire pointant vers la gauche.

Black back arrow

j'aimerais qu'il soit gris. Comment puis-je le faire?

dans la boutique Play, par exemple, la flèche est blanche.

j'ai fait ceci pour mettre quelques styles. J'ai utilisé @drawable/abc_ic_ab_back_mtrl_am_alpha pour homeAsUpIndicator . Que le dessin est transparent (seulement alpha) mais la flèche est affichée dans noir. Je me demande si je peux définir la couleur Comme je le fais dans le DrawerArrowStyle . Ou si la seule solution est de créer mon @drawable/grey_arrow et de l'utiliser pour 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>

Ma solution a été de prendre le @drawable/abc_ic_ab_back_mtrl_am_alpha , qui semble être blanc, et de le peindre dans la couleur que je désire à l'aide d'un éditeur de photo. Il fonctionne, bien que je préférerais utiliser @color/actionbar_text comme dans DrawerArrowStyle .

163
demandé sur Vivek Barai 2014-11-06 23:06:12

20 réponses

vous pouvez l'atteindre par le code. Obtenir la flèche de retour tirant, modifier sa couleur avec un filtre, et le mettre comme bouton de retour.

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

Révision 1:

à partir de API 23 (Marshmallow), la ressource abc_ic_ab_back_mtrl_am_alpha est remplacée par abc_ic_ab_back_material .

EDIT:

Vous pouvez utiliser ce code pour obtenir les résultats que vous voulez:

toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.blue_gray_15), PorterDuff.Mode.SRC_ATOP);
305
répondu Carles 2018-02-23 12:51:23

en regardant la source Toolbar et TintManager , drawable/abc_ic_ab_back_mtrl_am_alpha est teinté avec la valeur de l'attribut de style colorControlNormal .

j'ai essayé de mettre cela dans mon projet (avec <item name="colorControlNormal">@color/my_awesome_color</item> dans mon thème), mais c'est toujours noir pour moi.

mise à Jour :

L'a trouvé. Vous devez définir l'attribut actionBarTheme ( pas actionBarStyle ) avec colorControlNormal .

par exemple:

<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>
182
répondu rockgecko 2014-12-22 01:21:32

a essayé toutes les suggestions ci-dessus. La seule façon que j'ai réussi à changer la couleur de l'icône de navigation par défaut retour Flèche bouton dans ma barre d'outils est de mettre colorControlNormal dans le thème de base comme ceci. Probablement dû au fait que le parent utilise le thème.AppCompat.Lumière.NoActionBar

<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorControlNormal">@color/white</item> 
  //the rest of your codes...
</style>
102
répondu Harry Aung 2015-09-15 09:17:44

besoin d'ajouter un attribut unique à votre thème de barre d'outils -

<style name="toolbar_theme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="colorControlNormal">@color/arrow_color</item>
</style>

Appliquer cette toolbar_theme à votre barre d'outils.

OU

vous pouvez directement appliquer à votre thème -

<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorControlNormal">@color/arrow_color</item> 
  //your code ....
</style>
56
répondu Neo 2016-07-01 10:30:20

il suffit d'ajouter

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

à votre thème app actuel.

42
répondu S bruce 2016-08-23 14:32:02

comme dit sur la plupart des commentaires précédents, la solution est d'ajouter

<item name="colorControlNormal">@color/white</item> à votre thème d'application. Mais confirmez que vous n'avez pas un autre thème défini dans votre élément de la barre d'outils sur votre mise en page.

     <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" />
29
répondu manuelvsc 2016-09-15 10:07:00

si vous utilisez Toolbar , vous pouvez essayer ce

Drawable drawable = toolbar.getNavigationIcon();
drawable.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);
25
répondu longbaobao 2017-02-19 09:59:08

la réponse de Carles est la bonne réponse, mais peu des méthodes comme getDrawable(), getColor() se sont dépréciées au moment où j'écris cette réponse . Ainsi, la réponse actualisée serait

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

suite à d'autres requêtes stackoverflow, j'ai trouvé qu'appeler ContextCompat.getDrawable () est similaire à

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

Et ContextCompat.getColor () est similaire à

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

Link 1: ContextCompat.se faire retirer()

Link 2: ContextCompat.getColor()

10
répondu capt.swag 2017-05-23 12:26:38

Sur compileSdkVersoin 25, vous pourriez faire ceci:

les styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light">
     <item name="android:textColorSecondary">@color/your_color</item>
</style>
7
répondu nuttynibbles 2016-12-09 08:00:15

enter image description here

Changer Le Menu Couleur De L'Icône Nav

Final convert Menu Icon Color

en 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>
6
répondu Sumit Saxena 2017-02-16 07:33:27

j'ai trouvé une solution qui fonctionne pré Lollipop. Définir le " colorControlNormal "dans le" actionbargetwidtheme " pour changer la couleur de l'indicateur homeAsUpIndicator. Modifier la réponse de rockgecko d'en haut pour ressembler à ceci:

<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>
5
répondu GFred 2015-03-18 04:13:50

utiliser la méthode ci-dessous:

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

maintenant vous pouvez définir le dessin avec:

getSupportActionBar().setHomeAsUpIndicator(getColoredArrow());
5
répondu Jumpa 2015-12-08 13:37:42

une autre solution qui pourrait fonctionner pour vous est de ne pas déclarer votre barre d'outils comme la barre d'action de l'application (par setActionBar ou setSupportActionBar ) et de mettre l'icône de retour dans votre onActivityCreated en utilisant le code mentionné dans une autre réponse sur cette page

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

Maintenant, vous n'obtiendrez pas le rappel onOptionItemSelected lorsque vous appuyez sur le bouton arrière. Cependant, vous pouvez vous inscrire pour cela en utilisant setNavigationOnClickListener . C'est ce que je fais:

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

je suis pas sûr que ça marchera si vous travaillez avec des éléments du menu.

4
répondu Vinay Wadhwa 2016-07-07 23:24:05

nous étions confrontés au même problème et tout ce que nous voulions était de mettre le

app: collapseIcon

attribut dans la barre d'outils à la fin, que nous n'avons pas trouvé car il n'est pas très bien documenté:)

<android.support.v7.widget.Toolbar
         android:id="@+id/toolbar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/toolbarHeight"
         app:collapseIcon="@drawable/collapseBackIcon" />
1
répondu Julian Horst 2016-02-18 13:19:26

essayez cette

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

appel de fonction:

enableActionBarHomeButton(this, R.color.white);
1
répondu Siddarth Kanted 2016-10-24 11:34:43

vous pouvez changer la couleur de l'icône de navigation de façon programmatique comme ceci:

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
répondu pks 2016-04-28 07:07:38

il suffit de supprimer android:homeAsUpIndicator et homeAsUpIndicator de votre thème et il sera très bien. L'attribut color dans votre style DrawerArrowStyle doit être suffisant.

-1
répondu Flávio Faria 2014-11-06 20:37:55

Si vous voulez changer la couleur de la flèche pour toutes les icônes dans votre thème juste remplacer le fichier par défaut dans votre dossier drawable. Le nom du fichier par défaut est " abc_ic_ab_back_mtrl_am_alpha.png".

-1
répondu Daniel 2015-05-10 12:00:35

je viens de changer le thème de la barre d'outils pour être @style/ThemeOverlay.AppCompat.La lumière

et la flèche est devenu gris foncé

            <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">
-1
répondu fullMoon 2017-10-02 06:26:39

sauf s'il y a une meilleure solution...

ce que j'ai fait est de prendre les images @drawable/abc_ic_ab_back_mtrl_am_alpha , qui semblent être blanches, et les peindre dans la couleur que je désire en utilisant un éditeur de photos.

-4
répondu Ferran Maylinch 2014-11-08 19:38:18