Come cambiare il colore della freccia indietro nel nuovo tema materiale?


193

Ho aggiornato il mio SDK all'API 21 e ora l'icona di backup / su è una freccia nera che punta a sinistra.

Freccia posteriore nera

Vorrei che fosse grigio. Come lo posso fare?

Nel Play Store, ad esempio, la freccia è bianca.

L'ho fatto per impostare alcuni stili. Ho usato @drawable/abc_ic_ab_back_mtrl_am_alphaper homeAsUpIndicator. Quel disegno è trasparente (solo alfa) ma la freccia è visualizzata in nero. Mi chiedo se posso impostare il colore come faccio in DrawerArrowStyle. O se l'unica soluzione è creare il mio @drawable/grey_arrowe usarlo per 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>

Finora la mia soluzione è stata quella di prendere il @drawable/abc_ic_ab_back_mtrl_am_alpha, che sembra essere bianco, e dipingerlo nel colore che desidero usando un editor fotografico. Funziona, anche se preferirei usarlo @color/actionbar_textcome in DrawerArrowStyle.


Nessuna delle risposte basate su XML finora ha risolto questo problema per me, ma ho usato con successo il tuo homeAsUpIndicator/ @drawable/abc_ic_ab_back_mtrl_am_alphacode per rendere bianca la freccia indietro. Preferisco questo che hackerare Java.
divieto di geoingegneria il

Vecchio ma fermo. (Stavi) utilizzando ActionBar o la nuova barra degli strumenti?
f470071

Quello predefinito dovrebbe essere un po 'grigio, usando android: theme = "@ style / Widget.AppCompat.Light.ActionBar" all'interno del tag XML Toolbar. Il suo colore è # 737373
sviluppatore Android il

Risposte:


354

Puoi raggiungerlo tramite il codice. Ottieni il disegno con la freccia indietro, modificane il colore con un filtro e impostalo come pulsante Indietro.

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

Revisione 1:

A partire da API 23 (Marshmallow) la risorsa disegnabile abc_ic_ab_back_mtrl_am_alphaviene cambiata in abc_ic_ab_back_material.

MODIFICARE:

È possibile utilizzare questo codice per ottenere i risultati desiderati:

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

4
Questa è l'unica cosa che ha funzionato per me senza cambiare la tonalità di tutti gli altri widget con colorControlNormal
Joris

4
problema con questa soluzione è che dipinge tutte le altre frecce posteriori, se vuoi solo cambiarne una e lasciare il resto bianco
dabluck

24
Funziona. Si prega di notare che è necessario utilizzare ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_mtrl_am_alpha)perché getResources.getDrawable(int)è obsoleto
mrroboaat

3
Un'altra possibile soluzione sarebbe per te ottenere quella risorsa da te e metterla nelle tue cartelle disegnabili :)
Mauker,

12
Si noti che abc_ic_ab_back_mtrl_am_alpha è cambiato in abc_ic_ab_back_material nella libreria di supporto 23.2.0
Jon

206

Guardando Toolbare TintManagersource, drawable/abc_ic_ab_back_mtrl_am_alphaè colorato con il valore dell'attributo style colorControlNormal.

Ho provato a impostarlo nel mio progetto (con <item name="colorControlNormal">@color/my_awesome_color</item>nel mio tema), ma è ancora nero per me.

Aggiornamento :

Trovato. È necessario impostare l' actionBarThemeattributo ( non actionBarStyle ) con colorControlNormal.

Per esempio:

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

4
Questa dovrebbe essere la risposta accettata. Grazie per questo. Domanda, non riesco a trovare lo stile per colorare la freccia mostrata quando SearchView è espanso. Qualche idea? Apparentemente non è interessato da questa risposta.
Daniel Ochoa,

6
Devo aggiungere anche <item name = "android: colorControlNormal"> ... </item> con android: prefix
Seraphim's

7
Sfortunatamente questa è un'API di livello 21 e se vuoi supportare qualcosa di seguito non funzionerà.
gphilip

10
Se il tema principale deriva da uno dei temi "NoActionBar", l'impostazione colorControlNormalsul tema principale anziché su actionBarThemeè la strada da percorrere.
Jason Robinson,

3
Mi ci sono volute solo 2 ore di ricerche, errori e ricerche di nuovo per arrivare finalmente a questo. A volte lo stile 'sistema' in Android mi fa impazzire! Questo metodo è particolarmente importante da utilizzare quando si ha un'attività che non utilizza lo stesso stile delle altre.
Bron Davies,

119

Ho provato tutti i suggerimenti sopra. L'unico modo in cui sono riuscito a cambiare il colore dell'icona di navigazione predefinita Pulsante Indietro freccia nella mia barra degli strumenti è impostare colorControlNormal in tema base come questo. Probabilmente a causa del fatto che il genitore sta usando Theme.AppCompat.Light.NoActionBar

<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorControlNormal">@color/white</item> 
  //the rest of your codes...
</style>

6
La risposta più semplice di tutte, invece di armeggiare con altri codici, basta aggiungere questa riga nel tuostyle.xml
Rohan Kandwal

3
ricorda che colorControlNormal richiede API 21
Adnan Ali,

3
@AdnanAli se stai usando AppCompat funzionerà anche su <API 21. Chiaramente, AppCompat viene utilizzato qui perché colorControlNormalè non prefisso android:.
Vicky Chijwani,

3
Ma questo cambia anche il colore di tutti gli altri widget ... in qualche modo non influire su altri widget come la casella di controllo e i pulsanti di opzione?
Bruce,

2
Ma questo cambia anche il colore di altri controlli, come i pulsanti di opzione e la linea sotto la modifica del testo.
daka,

66

È necessario aggiungere un singolo attributo al tema della barra degli strumenti -

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

Applica questo toolbar_theme alla tua barra degli strumenti.

O

puoi applicare direttamente al tuo tema -

<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorControlNormal">@color/arrow_color</item> 
  //your code ....
</style>

5
Cercare la risposta accettata (forse la soluzione più popolare trovata in rete) non funziona per me ma questa funziona :) così pazza quando si programma con Android.
King King,

4
Risposta più semplice. Funziona senza cambiare altri temi di controllo. Tutto ciò che serve è impostare il tema della barra degli strumenti personalizzata sulla barra degli strumenti. :)
SimplyProgrammer

1
Oh, i dolori che devi affrontare per cambiare il colore di una sola icona .. Il primo funziona per me. Il secondo funziona per le barre degli strumenti personalizzate (e altre cose troppo apparentemente). 3 anni dopo, molte grazie Neo.
Aba,

45

Basta aggiungere

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

al tema attuale dell'app.


2
Questo sta cambiando anche il colore android.support.v7.widget.AppCompatCheckBox
Udi Oshi,

34

se uso Toolbar, puoi provare questo

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

Questa dovrebbe essere la risposta accettata, imho: prende di mira solo la freccia, ottiene la freccia da impostare usando i mezzi più semplici ed è compatibile anche sotto API 21
Antek

Se cerchi una soluzione più personalizzata (colori diversi per i titoli e le icone dei menu nel mio caso), questa è la soluzione che desideri
TheJudge,

3
Si noti che potrebbe essere necessario chiamare questo prima di provare a chiamare getNavigationIcon (): getSupportActionBar (). SetDisplayHomeAsUpEnabled (true);
rrbrambley,

La migliore risposta! Grazie.
shariful islam

32

Come detto nella maggior parte dei commenti precedenti, la soluzione è aggiungere

<item name="colorControlNormal">@color/white</item> al tema della tua app. Ma conferma che non hai un altro tema definito nel tuo elemento Toolbar sul tuo layout.

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

3
Fantastico ... Ho provato tutte le risposte sulle informazioni per aggiungerlo nel tema, ma non ha funzionato ... Come hai detto, avevo Android: theme = "@ style / ThemeOverlay.AppCompat.ActionBar" nella mia barra degli strumenti. Una volta rimosso, ha iniziato a funzionare.
Rahul Hawge,

10

La risposta di Carles è la risposta corretta, ma alcuni dei metodi come getDrawable (), getColor () sono diventati obsoleti nel momento in cui scrivo questa risposta . Quindi la risposta aggiornata sarebbe

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

A seguito di alcune altre query di StackOverflow ho scoperto che la chiamata a ContextCompat.getDrawable () è simile a

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

E ContextCompat.getColor () è simile a

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

Collegamento 1: ContextCompat.getDrawable ()

Link 2: ContextCompat.getColor ()


Dovrebbe essere abc_ic_ab_back_material, invece di abc_ic_ab_back_mtrl_am_alpha.
Narendra Singh,

7

Ho trovato una soluzione che funziona prima di Lollipop. Impostare "colorControlNormal" in "actionBarWidgetTheme" per modificare il colore di homeAsUpIndicator. Modifica la risposta di rockgecko dall'alto per assomigliare a questa:

<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

Su compileSdkVersoin 25, puoi fare questo:

styles.xml

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

6

Usa il metodo seguente:

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

Ora puoi impostare il disegno con:

getSupportActionBar().setHomeAsUpIndicator(getColoredArrow());

6

inserisci qui la descrizione dell'immagine

Cambia menu Icona Nav Colore

Converti finale Menu Icona Colore

In 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

Un'altra soluzione che potrebbe funzionare per te è quella di non dichiarare la barra degli strumenti come barra delle azioni dell'app (da setActionBaro setSupportActionBar) e impostare l'icona indietro in onActivityCreated utilizzando il codice indicato in un'altra risposta in questa pagina

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

Ora, non riceverai la onOptionItemSelectedrichiamata quando premi il pulsante Indietro. Tuttavia, è possibile registrarsi per quello utilizzando setNavigationOnClickListener. Questo è ciò che faccio:

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

Non sono sicuro che funzionerà se lavori con le voci di menu.


3

Stavamo riscontrando lo stesso problema e tutto ciò che volevamo era impostare il

app: collapseIcon

attributo nella barra degli strumenti alla fine, che non abbiamo trovato poiché non è ben documentato :)

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

3

prova questo

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

chiamata di funzione:

enableActionBarHomeButton(this, R.color.white);

L'impostazione dell'opzione di visualizzazione {@link #DISPLAY_HOME_AS_UP} attiverà automaticamente il pulsante Home.
P. Savrov,

2

Questo è ciò che ha funzionato per me:

Aggiungi gli attributi seguenti al tuo tema.

Per cambiare la freccia indietro della barra degli strumenti / della barra delle azioni sopra api 21

<item name="android:homeAsUpIndicator">@drawable/your_drawable_icon</item>

Per cambiare la freccia indietro della barra degli strumenti / della barra delle azioni sotto api 21

<item name="homeAsUpIndicator">@drawable/your_drawable_icon</item>

Per cambiare la modalità freccia indietro

<item name="actionModeCloseDrawable">@drawable/your_drawable_icon</item>

Per rimuovere l'ombra della barra degli strumenti / della barra delle azioni

<item name="android:elevation" tools:targetApi="lollipop">0dp</item>
<item name="elevation">0dp</item>
<!--backward compatibility-->
<item name="android:windowContentOverlay">@null</item>

Per modificare il drawable di overflow della barra delle azioni

<!--under theme-->
<item name="actionOverflowButtonStyle">@style/MenuOverflowStyle</item>

<style name="MenuOverflowStyle" parent="Widget.AppCompat.ActionButton.Overflow">
<item name="srcCompat">@drawable/ic_menu_overflow</item>

Nota: 'srcCompat' viene utilizzato invece di 'android: src' a causa del supporto di disegno vettoriale per API inferiore a 21


2

La soluzione è molto semplice

Basta inserire la seguente riga nel tuo stile chiamato AppTheme

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

Ora l'intero codice XML apparirà come mostrato di seguito (stile predefinito).

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <item name="colorPrimary">#0F0F0F</item>
        <item name="android:statusBarColor">#EEEEF0</item>
        <item name="android:windowLightStatusBar">true</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowActivityTransitions">true</item>

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

1

Ho appena cambiato il tema della barra degli strumenti in @ style / ThemeOverlay.AppCompat.Light

e la freccia divenne grigio scuro

            <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

Ecco come l'ho fatto in Componenti materiali:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="drawerArrowStyle">@style/AppTheme.DrawerArrowToggle</item>
</style>

<style name="AppTheme.DrawerArrowToggle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="color">@android:color/white</item>
</style>

Amico, mi hai salvato la giornata. Ho trascorso l'intera giornata solo su questo. Vorrei poterti dare più voti.
Dhaval Patel,

0

È possibile modificare il colore dell'icona di navigazione a livello di codice in questo modo:

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

-1

Basta rimuovere android:homeAsUpIndicatore homeAsUpIndicatordal tuo tema e andrà bene. L' colorattributo nel tuo DrawerArrowStylestile deve essere sufficiente.


L'ho già provato e la freccia è nera. Nota che questa freccia non è la stessa che vedi quando apri il cassetto (quella freccia È influenzata dall'attributo color). La freccia del cassetto è un po 'più grande.
Ferran Maylinch,

1
Quindi, sembra che dovrai fornire la tua risorsa disegnabile. Puoi generarlo utilizzando questo strumento: shreyasachar.github.io/AndroidAssetStudio
Flávio Faria

-4

A meno che non ci sia una soluzione migliore ...

Quello che ho fatto è stato prendere le @drawable/abc_ic_ab_back_mtrl_am_alphaimmagini, che sembrano bianche, e dipingerle con il colore che desidero usando un editor fotografico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.