Ich habe mein SDK auf API 21 aktualisiert. Jetzt ist das Symbol "Zurück/Hoch" ein schwarzer Pfeil, der nach links zeigt.
Ich möchte, dass es grau ist. Wie kann ich das machen?
Im Play Store zum Beispiel ist der Pfeil weiß.
Ich habe dies gemacht, um einige Stile festzulegen. Ich habe @drawable/abc_ic_ab_back_mtrl_am_alpha
für homeAsUpIndicator
verwendet. Das Zeichen ist transparent (nur Alpha), aber der Pfeil wird schwarz angezeigt. Ich frage mich, ob ich die Farbe wie in DrawerArrowStyle
einstellen kann. Oder wenn die einzige Lösung darin besteht, meinen @drawable/grey_arrow
zu erstellen und ihn für homeAsUpIndicator
zu verwenden.
<!-- 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 war, den @drawable/abc_ic_ab_back_mtrl_am_alpha
, der weiß zu sein scheint, zu nehmen und ihn mit einem Fotoeditor in der gewünschten Farbe zu malen. Es funktioniert, obwohl ich lieber @color/actionbar_text
wie in DrawerArrowStyle
verwenden möchte.
Sie können es durch Code erreichen. Erhalten Sie den rückseitigen Pfeil, der mit einem Filter gezeichnet werden kann, und legen Sie ihn als Schaltfläche "Zurück" 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:
Ausgehend von API 23 (Marshmallow) wird die Ressource abc_ic_ab_back_mtrl_am_alpha
in abc_ic_ab_back_material
geändert.
BEARBEITEN:
Sie können diesen Code verwenden, um die gewünschten Ergebnisse zu erzielen:
toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.blue_gray_15), PorterDuff.Mode.SRC_ATOP);
Wenn Sie die Quelle Toolbar
und TintManager
betrachten, ist drawable/abc_ic_ab_back_mtrl_am_alpha
mit dem Wert des Stilattributs colorControlNormal
eingefärbt.
Ich habe versucht, dies in meinem Projekt einzustellen (mit <item name="colorControlNormal">@color/my_awesome_color</item>
in meinem Design), aber es ist immer noch schwarz für mich.
Update :
Fand es. Sie müssen das actionBarTheme
-Attribut ( nicht actionBarStyle
) mit colorControlNormal
setzen.
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>
Alle oben genannten Vorschläge ausprobiert. Die einzige Möglichkeit, die Farbe des Navigationssymbols für den Standard-Zurück-Pfeil in meiner Symbolleiste zu ändern, ist das Festlegen von colorControlNormal im Basisdesign. 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>
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 direkt auf Ihr Thema anwenden -
<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorControlNormal">@color/arrow_color</item>
//your code ....
</style>
Einfach hinzufügen
<item name="colorControlNormal">@color/white</item>
zu Ihrem aktuellen App-Thema.
Wie in den meisten vorangegangenen Kommentaren gesagt, ist die Lösung hinzuzufügen
<item name="colorControlNormal">@color/white</item>
zu Ihrem App-Design. Bestätigen Sie jedoch, dass in Ihrem Toolbar-Element kein anderes Thema in Ihrem Layout 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" />
wenn Sie Toolbar
verwenden, können Sie dies versuchen
Drawable drawable = toolbar.getNavigationIcon();
drawable.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);
Die Antwort von Carles ist die richtige Antwort, aber einige der Methoden wie getDrawable (), getColor () wurden zu dem Zeitpunkt, als ich diese Antwort schreibe, nicht mehr unterstützt. 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);
Bei einigen anderen Stackoverflow-Abfragen fand ich heraus, dass der Aufruf von ContextCompat.getDrawable () dem von
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
return resources.getDrawable(id, context.getTheme());
} else {
return resources.getDrawable(id);
}
Und ContextCompat.getColor () ist ähnlich
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);
}
}
Ich habe eine Lösung gefunden, die vor Lollipop funktioniert. Stellen Sie "colorControlNormal" in "actionBarWidgetTheme" ein, um die Farbe von homeAsUpIndicator zu ändern. Die Antwort von Rockgecko von oben zu ändern, sieht folgendermaßen aus:
<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>
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>
Verwenden Sie die Methode unten:
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 Zeichen mit einstellen:
getSupportActionBar().setHomeAsUpIndicator(getColoredArrow());
Ändern Sie die Farbe des Menü-Nav-Symbols
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>
Eine andere Lösung, die möglicherweise für Sie geeignet ist, besteht darin, die Symbolleiste nicht als Aktionsleiste der App zu deklarieren (durch setActionBar
oder setSupportActionBar
) und das Rücksymbol in onActivityCreated mit dem in einer anderen Antwort auf dieser Seite erwähnten Code zu setzen
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 wird der onOptionItemSelected
-Rückruf nicht angezeigt, wenn Sie die Zurück-Taste drücken. Sie können sich jedoch mit setNavigationOnClickListener
dafür registrieren. 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 funktioniert, wenn Sie mit Menüelementen arbeiten.
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);
Wir hatten das gleiche Problem und wollten nur das einstellen
app: collapseIcon
attribut in der Toolbar 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" />
Sie können die Farbe des Navigationssymbols wie folgt programmgesteuert ä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;
}
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">
Einfache Lösung, die für mich funktioniert hat (wenn Sie in der gesamten App dieselbe Pfeilfarbe verwenden müssen):
Speichern Sie das Pfeilsymbol, das Sie verwenden möchten, in dem Zeichenordner (stellen Sie sicher, dass es die gewünschte Farbe hat; Sie können Ihre Farbe in XML ändern, wenn Sie XML-Vektor-Zeichenweise verwenden).
Ordnen Sie dieses neue Pfeilsymbol der Aktionsleiste zu:
ActionBar actionBar = getSupportActionBar (); ActionBar.setHomeAsUpIndicator (R.drawable.ic_your_icon_here);