Wie ändere ich die Farbe des hinteren Pfeils im neuen Materialthema?


193

Ich habe mein SDK auf API 21 aktualisiert und jetzt ist das Sicherungs- / Sicherungssymbol ein schwarzer Pfeil, der nach links zeigt.

Schwarzer Pfeil nach hinten

Ich möchte, dass es grau ist. Wie kann ich das machen?

Im Play Store ist der Pfeil beispielsweise weiß.

Ich habe dies getan, um einige Stile festzulegen. Ich habe @drawable/abc_ic_ab_back_mtrl_am_alphafür verwendet homeAsUpIndicator. Diese Zeichnung ist transparent (nur Alpha), aber der Pfeil wird schwarz angezeigt. Ich frage mich, ob ich die Farbe wie in der einstellen kann DrawerArrowStyle. Oder wenn die einzige Lösung darin besteht, meine zu erstellen @drawable/grey_arrowund für zu verwenden 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>

Meine bisherige Lösung bestand darin, das @drawable/abc_ic_ab_back_mtrl_am_alpha, was weiß zu sein scheint, mit einem Bildbearbeitungsprogramm in der gewünschten Farbe zu malen. Es funktioniert, obwohl ich es vorziehen würde, @color/actionbar_textwie in zu verwenden DrawerArrowStyle.


Bisher hat keine der XML-basierten Antworten dieses Problem für mich gelöst, aber ich habe Ihren homeAsUpIndicator/ @drawable/abc_ic_ab_back_mtrl_am_alpha-Code erfolgreich verwendet , um den Zurückpfeil weiß zu machen. Ich bevorzuge dies als das Hacken in Java.
Ban-Geoengineering

Alt aber still. Verwenden Sie ActionBar oder die neue Symbolleiste?
f470071

Die Standardeinstellung sollte mit android: theme = "@ style / Widget.AppCompat.Light.ActionBar" im XML-Tag der Symbolleiste etwas grau sein. Seine Farbe ist # 737373
Android-Entwickler

Antworten:


354

Sie können es durch Code erreichen. Erhalten Sie den Zeichenpfeil zum Zeichnen, ändern Sie seine Farbe mit einem Filter und legen Sie ihn als Zurück-Schaltfläche fest.

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

Revision 1:

Ab API 23 (Marshmallow) wird die zeichnbare Ressource abc_ic_ab_back_mtrl_am_alphain geändert abc_ic_ab_back_material.

BEARBEITEN:

Mit diesem Code können Sie die gewünschten Ergebnisse erzielen:

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

4
Dies ist das einzige, was für mich funktioniert hat, ohne den Farbton aller anderen Widgets mit colorControlNormal
Joris

4
Problem mit dieser Lösung ist, dass es alle Ihre anderen
Rückenpfeile

24
Es klappt. Bitte beachten Sie, dass Sie verwenden sollten, ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_mtrl_am_alpha)weil getResources.getDrawable(int)veraltet ist
mrroboaat

3
Eine andere mögliche Lösung wäre, dass Sie diese Ressource selbst erhalten und in Ihre Zeichenordner legen :)
Mauker

12
Beachten Sie, dass abc_ic_ab_back_mtrl_am_alpha in der 23.2.0 Support - Bibliothek abc_ic_ab_back_material geändert
Jon

206

Wenn Sie die Quelle Toolbarund TintManagerbetrachten, drawable/abc_ic_ab_back_mtrl_am_alphawird sie mit dem Wert des Stilattributs getönt colorControlNormal.

Ich habe versucht, dies in meinem Projekt (mit <item name="colorControlNormal">@color/my_awesome_color</item>in meinem Thema) festzulegen, aber es ist immer noch schwarz für mich.

Update :

Fand es. Sie müssen das actionBarThemeAttribut ( nicht actionBarStyle ) mit festlegen colorControlNormal.

Z.B:

<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
Dies sollte die akzeptierte Antwort sein. Danke dafür. Frage: Ich kann den Stil zum Färben des Pfeils nicht finden, der angezeigt wird, wenn SearchView erweitert wird. Irgendeine Ahnung? Es ist anscheinend nicht von dieser Antwort betroffen.
Daniel Ochoa

6
Ich muss auch <item name = "android: colorControlNormal"> ... </ item> mit dem Präfix android: hinzufügen
Seraphims

7
Leider ist dies eine Level 21 API und wenn Sie etwas darunter unterstützen möchten, funktioniert es nicht.
Gphilip

10
Wenn Ihr übergeordnetes Thema von einem der "NoActionBar" -Themen abgeleitet ist, ist die Einstellung colorControlNormalauf das Stammthema und nicht auf das actionBarThemeder Weg.
Jason Robinson

3
Ich habe nur 2 Stunden lang gesucht und versagt und erneut gesucht, um endlich dazu zu kommen. Manchmal macht mich das Style-System in Android verrückt! Diese Methode ist besonders wichtig, wenn Sie eine Aktivität haben, die nicht das gleiche Design wie die anderen verwendet.
Bron Davies

118

Versuchte alle Vorschläge oben. Die einzige Möglichkeit, die Farbe des Standardpfeils der Zurück-Schaltfläche des Navigationssymbols in meiner Symbolleiste zu ändern, besteht darin, colorControlNormal in einem Basisthema wie diesem festzulegen. Wahrscheinlich aufgrund der Tatsache, dass das übergeordnete Element Theme.AppCompat.Light.NoActionBar verwendet

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

6
Einfachste Antwort von allen, anstatt mit anderem Code style.xml
herumzuspielen

3
Denken Sie daran, dass colorControlNormal API 21 erfordert
Adnan Ali

3
@AdnanAli Wenn Sie AppCompat verwenden, funktioniert es auch mit <API 21. Offensichtlich AppCompat ist hier , weil verwendet wird , colorControlNormalist nicht mit dem Präfix android:.
Vicky Chijwani

3
Dies ändert jedoch auch den Farbton aller anderen Widgets. Gibt es eine Möglichkeit, andere Widgets wie Kontrollkästchen und Optionsfelder nicht zu beeinflussen?
Bruce

2
Dies ändert jedoch auch die Farbe anderer Steuerelemente wie Optionsfelder und der Zeile unter Textbearbeitung.
Daka

66

Sie müssen Ihrem Symbolleisten-Design ein einzelnes Attribut hinzufügen -

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

Wenden Sie dieses toolbar_theme auf Ihre Symbolleiste an.

ODER

Sie können sich direkt auf Ihr Thema bewerben -

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

5
Das Versuchen der akzeptierten Antwort (vielleicht die beliebteste Lösung im Internet) funktioniert bei mir nicht, aber diese funktioniert :) so verrückt beim Programmieren mit Android.
König König

4
Einfachste Antwort. Dies funktioniert ohne Änderung anderer Steuerelementthemen. Sie müssen lediglich das benutzerdefinierte Symbolleisten-Design auf Ihre Symbolleiste festlegen. :)
SimplyProgrammer

1
Oh, die Schmerzen, die Sie durchmachen müssen, um die Farbe von nur 1 Symbol zu ändern. Das erste funktioniert für mich. Die zweite funktioniert für benutzerdefinierte Symbolleisten (und andere Dinge anscheinend auch). 3 Jahre später vielen Dank Neo.
Aba

45

Einfach hinzufügen

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

zu Ihrem aktuellen App-Thema.


2
Dies ändert auch die Farbe android.support.v7.widget.AppCompatCheckBox
Udi Oshi

34

Wenn Sie es verwenden Toolbar, können Sie dies versuchen

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

Dies sollte die akzeptierte Antwort sein, imho - es zielt nur auf den Pfeil ab, lässt den Pfeil mit einfachsten Mitteln setzen und ist auch unter API 21
Antek

Wenn Sie nach einer benutzerdefinierteren Lösung suchen (in meinem Fall verschiedene Farben für Titel und
Menüsymbole

3
Beachten Sie, dass Sie dies möglicherweise aufrufen müssen, bevor Sie versuchen, getNavigationIcon () aufzurufen: getSupportActionBar (). SetDisplayHomeAsUpEnabled (true);
Rrbrambley

Die beste Antwort! Danke dir.
Shariful Islam

32

Wie in den meisten vorherigen Kommentaren erwähnt, besteht die Lösung darin, hinzuzufügen

<item name="colorControlNormal">@color/white</item> zu Ihrem App-Thema. Stellen Sie jedoch sicher, dass in Ihrem Symbolleistenelement in Ihrem Layout kein anderes Thema definiert ist.

     <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
Genial ... Ich habe alle Antworten ausprobiert, um sie in das Thema einzufügen, aber es hat nicht funktioniert ... Wie Sie bereits erwähnt haben, hatte ich die Eigenschaft android: theme = "@ style / ThemeOverlay.AppCompat.ActionBar" in meiner Symbolleiste. Sobald ich es entfernt hatte, fing es an zu funktionieren.
Rahul Hawge

10

Die Antwort von Carles ist die richtige Antwort, aber einige der Methoden wie getDrawable (), getColor () waren zum Zeitpunkt des Schreibens dieser Antwort veraltet . Die aktualisierte Antwort wäre also

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

Nach einigen anderen Stackoverflow-Abfragen stellte ich fest, dass das Aufrufen von ContextCompat.getDrawable () ähnlich ist

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

Und ContextCompat.getColor () ähnelt

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.getDrawable ()

Link 2: ContextCompat.getColor ()


Es sollte abc_ic_ab_back_materialstatt sein abc_ic_ab_back_mtrl_am_alpha.
Narendra Singh

7

Ich habe eine Lösung gefunden, die vor Lollipop funktioniert. Stellen Sie "colorControlNormal" in "actionBarWidgetTheme" ein, um die Farbe homeAsUpIndicator zu ändern. Ändern Sie die Antwort von rockgecko von oben so:

<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

Auf compileSdkVersoin 25 können Sie Folgendes tun:

styles.xml

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

6

Verwenden Sie die folgende Methode:

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

Jetzt können Sie das Drawable einstellen mit:

getSupportActionBar().setHomeAsUpIndicator(getColoredArrow());

6

Geben Sie hier die Bildbeschreibung ein

Ändern Sie die Farbe des Navigationssymbols

Final Convert Menu Icon Farbe

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

Eine andere Lösung, die für Sie möglicherweise funktioniert, besteht darin, Ihre Symbolleiste nicht als Aktionsleiste der App (von setActionBaroder setSupportActionBar) zu deklarieren und das Zurück-Symbol in Ihrem onActivityCreated mithilfe des in einer anderen Antwort auf dieser Seite genannten Codes festzulegen

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

Jetzt erhalten Sie keinen onOptionItemSelectedRückruf mehr, wenn Sie die Zurück-Taste drücken. Sie können sich jedoch dafür mit registrieren setNavigationOnClickListener. Das ist was ich mache:

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

Ich bin nicht sicher, ob es funktionieren wird, wenn Sie mit Menüelementen arbeiten.


3

Wir hatten das gleiche Problem und wollten nur das einstellen

App: CollapseIcon

Attribut in der Symbolleiste am Ende, das wir nicht gefunden haben, da es nicht sehr gut dokumentiert ist :)

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

3

Versuche dies

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

Funktionsaufruf:

enableActionBarHomeButton(this, R.color.white);

Durch Festlegen der Anzeigeoption {@link #DISPLAY_HOME_AS_UP} wird die Home-Schaltfläche automatisch aktiviert.
P. Savrov

2

Das hat bei mir funktioniert:

Fügen Sie Ihrem Thema die folgenden Attribute hinzu.

So ändern Sie den Zurückpfeil der Symbolleiste / Aktionsleiste über API 21

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

So ändern Sie den Zurückpfeil der Symbolleiste / Aktionsleiste unter API 21

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

So ändern Sie den Aktionsmodus Zurück Pfeil

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

So entfernen Sie den Schatten der Symbolleiste / Aktionsleiste

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

Zum Ändern des Aktionsleistenüberlaufs kann gezeichnet werden

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

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

Hinweis: 'srcCompat' wird anstelle von 'android: src' verwendet, da APIs unter 21 von Vektoren gezeichnet werden können


1

Ich habe gerade das Symbolleisten-Design in @ style / ThemeOverlay.AppCompat.Light geändert

und der Pfeil wurde dunkelgrau

            <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

So habe ich es in Material Components gemacht:

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

Kumpel, du hast meinen Tag gerettet. Ich habe den ganzen Tag nur mit diesem verbracht. Ich wünschte, ich könnte Ihnen mehr Stimmen geben.
Dhaval Patel

1

Die Lösung ist sehr einfach

Fügen Sie einfach die folgende Zeile in Ihren Stil mit dem Namen AppTheme ein

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

Jetzt sieht Ihr gesamter XML-Code wie unten gezeigt aus (Standardstil).

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

0

Sie können die Farbe des Navigationssymbols programmgesteuert folgendermaßen ändern:

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

Entfernen Sie einfach android:homeAsUpIndicatorund homeAsUpIndicatoraus Ihrem Thema und es wird in Ordnung sein. Das colorAttribut in Ihrem DrawerArrowStyleStil muss ausreichen.


Das habe ich schon versucht und der Pfeil ist schwarz. Beachten Sie, dass dieser Pfeil nicht derselbe Pfeil ist, den Sie beim Öffnen der Schublade sehen (dieser Pfeil ist vom colorAttribut betroffen ). Der Schubladenpfeil ist etwas größer.
Ferran Maylinch

1
Es scheint also, dass Sie Ihre eigene zeichnbare Ressource bereitstellen müssen. Sie können es mit diesem Tool generieren: shreyasachar.github.io/AndroidAssetStudio
Flávio Faria

-4

Es sei denn, es gibt eine bessere Lösung ...

Was ich getan habe, ist, die @drawable/abc_ic_ab_back_mtrl_am_alphaBilder, die weiß zu sein scheinen, mit einem Bildbearbeitungsprogramm in der gewünschten Farbe zu malen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.