ActionBar-Textfarbe


288

Wie kann ich die Textfarbe der ActionBar ändern? Ich habe das Holo Light-Thema geerbt. Ich kann den Hintergrund der ActionBar ändern, finde aber nicht heraus, welches Attribut zum Ändern der Textfarbe angepasst werden muss.


Ok, ich kann die Textfarbe mit dem Attribut android: textColorPrimary ändern, aber es ändert auch die Textfarbe des Dropdown-Menüs, das angezeigt wird, wenn ein Überlauf auf den ActionBar-Schaltflächen auftritt. Irgendeine Idee, wie man die Farbe dieser Dropdown-Menüs / Listen ändert?


habe gerade eine Lösung gepostet, die für mich funktioniert hat. siehe hier stackoverflow.com/a/16175220/627827
spaceMonkey

Antworten:


447

Ok, ich habe einen besseren Weg gefunden. Ich kann jetzt nur die Farbe des Titels ändern. Sie können auch den Untertitel anpassen.

Hier ist meine styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/MyTheme.ActionBarStyle</item>
  </style>

  <style name="MyTheme.ActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
  </style>

  <style name="MyTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textColor">@color/red</item>
  </style>
</resources>

32
Dies ist der richtige Weg. Aus Gründen der Konsistenz sollten Sie jedoch von Widget.Holo.Light.ActionBarfor erben MyTheme.ActionBarStyle.
Jake Wharton

7
Wird nicht gebaut - ADT beschwert sich, dass es v13 oder höher erfordert (also ... funktioniert auf den meisten Android-Handys nicht :()
Adam

8
@Adam Ich hatte das gleiche Problem, aber die nächste Antwort funktioniert für mich - anstelle von parent = "@ android: style / TextAppearance.Holo.Widget.ActionBar.Title" use parent = "@ android: style / TextAppearance"
bkurzius

8
Wenn Sie die Appcompat-Bibliothek verwenden, ersetzen Sie Holo durch AppCompat. Es funktioniert
sha

3
@LOG_TAG Verwenden Sie Widget.AppCompat.Light.ActionBar
sha

97

Ich habe einen Weg gefunden, der mit jedem Geschmack von ActionBar( Sherlock , Compat und Native ) gut funktioniert :

Verwenden Sie einfach HTML , um den Titel festzulegen und die Textfarbe anzugeben. Um beispielsweise die ActionBar-Textfarbe auf Rot zu setzen, gehen Sie einfach wie folgt vor :

getActionBar()/* or getSupportActionBar() */.setTitle(Html.fromHtml("<font color=\"red\">" + getString(R.string.app_name) + "</font>"));

Sie können auch den roten Hex-Code #FF0000anstelle des Wortes verwenden red. Wenn Sie Probleme damit haben, lesen Sie, dass Android Html.fromHtml (String) für <font color = '#'> Text </ font> nicht funktioniert .


Wenn Sie eine Farbressource verwenden möchten, kann dieser Code außerdem verwendet werden, um den richtigen HEX-String abzurufen und bei Bedarf das Alpha zu entfernen (das Schriftart- Tag unterstützt kein Alpha):

int orange = getResources().getColor(R.color.orange);
String htmlColor = String.format(Locale.US, "#%06X", (0xFFFFFF & Color.argb(0, Color.red(orange), Color.green(orange), Color.blue(orange))));

Dies gibt einen Fehler aus, da Sie eine Zeichenfolge in die Methode Html.fromHtml () einfügen müssen und mehrere Parameter in die Methode einfügen. Beim Ersetzen des "," durch "+" funktioniert dies einwandfrei :-).
pinyin_samu

3
Nach jahrzehntelanger Suche ist dies die einfachste Lösung! Gut gemacht!
Bmkay

2
@MSI, können Sie Hex - Werte verwenden, ersetzen Sie einfach redmit " + color + ".
Phil

1
@MSI, können Sie versuchen, was dieser Beitrag vorschlägt (auch meine Frage aktualisiert)? Ersetzen Sie einfach #FF0000mit "+color+".
Phil

1
Danke Phil. Es funktioniert perfekt! Ich habe es folgendermaßen versucht: getSupportActionBar (). SetTitle (Html.fromHtml ("<font color = '" + color + "'>" + "Home" + "</ font>")); Muss nur 'anstelle von \ verwenden.
MSIslam

93

Ich hatte das gleiche Problem wie Sie, es ist ein Holo.Light-Thema, aber ich wollte die ActionBar-Farbe stylen, daher musste ich auch die Textfarbe sowie Titel und Menüs ändern. Am Ende ging ich zu Git Hub und schaute mir den Quellcode an, bis ich den verdammt richtigen Stil gefunden hatte:

<?xml version="1.0" encoding="utf-8"?>
<!-- For honeycomb and up -->
<resources>

    <style name="myTheme" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarStyle">@style/myTheme.ActionBar</item>
        <item name="android:actionMenuTextColor">@color/actionBarText</item>
    </style>

    <style name="myTheme.ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">@drawable/actionbarbground</item>
        <item name="android:titleTextStyle">@style/myTheme.ActionBar.Text</item>
    </style>

    <style name="myTheme.ActionBar.Text" parent="@android:style/TextAppearance">
        <item name="android:textColor">@color/actionBarText</item>
    </style>

</resources>

so jetzt alles , was Sie tun müssen, wird auch immer @color/actionBarTextund @drawable/actionbarbgroundSie wollen!


Wo muss ich diese XML verwenden? Werte oder Werte-v11 oder Werte v-14 ??
DroidLearner

Die Antwort ist vom Februar 2012, es gab nicht V14 zu der Zeit. Also V11 sicher.
Budius

Unter 3.0 verfügt das System nicht über eine Aktionsleiste.
Budius

Ich benutze Action Bar Sherlock und habe die Lösung gefunden. Danke :)
DroidLearner

3
Für Actionbar Sherlock müssen Sie die Actionbar-spezifischen Namen verwenden und Sie können diesen Generator verwenden: jgilfelt.github.com/android-actionbarstylegenerator Wir verwenden ihn immer dort, wo ich arbeite. Es ist sehr gut
Budius

67

Die ActionBar-ID ist nicht direkt verfügbar, daher müssen Sie hier ein wenig hacken.

int actionBarTitleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
if (actionBarTitleId > 0) {
    TextView title = (TextView) findViewById(actionBarTitleId);
    if (title != null) {
        title.setTextColor(Color.RED);
    }
}

1
NullPointerExceptionauf dieser LinieactionBarTextView.setTextColor(Color.RED);
DroidLearner

3
Wenn Sie API Level <11, ActionBarSherlock ausführen und sich einen teuren Aufruf ersparen möchten getIndentifier(), können Sie zuerst nachsehen (TextView) findViewById(com.actionbarsherlock.R.id.abs__action_bar_title);(überprüfen Sie, ob es nicht null ist).
Andre

"Die ActionBar-ID ist nicht direkt verfügbar" In meinem Fall ist die Symbolleiste leicht zugänglich, so wie sie Toolbar toolbar = findViewById(R.id.toolbar);in der XML-Layoutdatei von einem com.google.android.material.appbar.AppBarLayoutElement umgeben ist. Danntoolbar.setTitleTextColor( getResources().getColor( R.color.colorViolet ) );
YoussefDir

32

Es ist ein altes Thema, aber für zukünftige Leser macht die Verwendung von ToolBar alles sehr einfach:

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
toolbar.setTitle(R.string.app_name);
toolbar.setTitleTextColor(getResources().getColor(R.color.someColor));
setSupportActionBar(toolbar);


28

Fügen Sie es dem Stammverzeichnis der Aktionsleiste hinzu. Ich hatte dieses Problem.

<style name="ActionBar" parent="@style/Theme.AppCompat.Light">
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <item name="actionMenuTextColor">@color/stdDarkBlueText</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <item name="titleTextStyle">@style/ActionBarTitleText</item>
    <item name="subtitleTextStyle">@style/ActionBarSubTitleText</item>
</style>

<style name="ActionBarTitleText" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="android:textColor">@color/stdDarkBlueText</item>
    <item name="android:textSize">12sp</item>
</style>

<style name="ActionBarSubTitleText" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle">
    <item name="android:textColor">@color/stdDarkBlueText</item>
    <item name="android:textSize">12sp</item>
</style>

actionMenuTextColor - Ändert die Textfarbe für den Text der Aktionsleiste. Es hat nie funktioniert, als es Teil von war Widget.Styled.ActionBar, also musste ich es dem Stamm hinzufügen. Andere 2 Attribute ändern Titel und Untertitel einer Aktionsleiste.


Verwenden Sie "android: actionMenuTextColor" anstelle von "actionMenuTextColor". :)
AnkitRox

20

Das Festlegen einer HTML-Zeichenfolge in der Aktionsleiste funktioniert nicht für das Material-Design in SDK v21 +

Wenn Sie es ändern möchten, sollten Sie die primäre Textfarbe in Ihrer style.xml festlegen

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Material.Light">
        <!-- Customize your theme here. -->
        <item name="android:textColorPrimary">@color/actionbar-text-color</item>
    </style>
</resources>    

1
Dies ändert die primäre Textfarbe überall in der Anwendung!
Mohammed

16

Am einfachsten ist es, dies in der Datei styles.xml zu tun.

Die Vorlage styles.xml von Google generiert derzeit Folgendes:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Wenn Sie wie gezeigt eine weitere Zeile vor dem schließenden Tag hinzufügen, ändert sich die Textfarbe so, wie sie mit einer Dark ActionBar sein sollte:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionBarTheme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

Wenn Sie die Farbe an etwas anderes anpassen möchten, können Sie entweder Ihre eigene Farbe in colours.xml angeben oder sogar eine integrierte Farbe von Android verwenden, indem Sie das Attribut android: textColorPrimary verwenden:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionBarTheme">@style/AppTheme.AppBarOverlay</item>
</style>


<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:textColorPrimary">@android:color/darker_gray</item>
</style>

Hinweis: Dadurch werden die Farbe des Titels und auch die Titel aller in der Aktionsleiste angezeigten Menüelemente geändert.


12

Wenn Sie den Untertitel auch formatieren möchten, fügen Sie ihn einfach in Ihren benutzerdefinierten Stil ein.

<item name="android:subtitleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>

Leute, die das gleiche Ergebnis für die AppCompatBibliothek erzielen wollen, dann habe ich Folgendes verwendet:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomActivityTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
        <item name="actionBarStyle">@style/MyActionBar</item>
        <!-- other activity and action bar styles here -->
    </style>

    <!-- style for the action bar backgrounds -->
    <style name="MyActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:background">@drawable/actionbar_background</item>
        <item name="background">@drawable/actionbar_background</item>
        <item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
        <item name="android:subtitleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
        <item name="titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
        <item name="subtitleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
     </style>
    <style name="MyTheme.ActionBar.TitleTextStyle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
        <item name="android:textColor">@color/color_title</item>
      </style>
</resources>

Ich versuche ein helles Thema, eine dunkle Aktionsleiste und weißen Text. Ihr Code ist das einzige, was ich bisher gefunden habe, das überhaupt Auswirkungen hat, aber die gesamte Aktionsleiste wird weiß. Irgendeine Idee, was los sein könnte? Ja, ich weiß, das ist anderthalb Jahre alt. :-)
nasch

Dies hat mir geholfen, mein Problem zu lösen. Ich musste nur beides hinzufügen <item name="android:titleTextStyle"> und <item name="titleTextStyle"> weil ich die Appcompat-Unterstützungsbibliothek verwendete.
Rock Lee

der Titel verschwindet
jairhumberto

8

Ich habe den Weg gefunden, dies gut zu machen, ohne ein eigenes Layout auf API> = 21 zu erstellen.

Es werden nur Texte eingefärbt und Zeichen in der Aktionsleiste gesteuert.

Hoffe, es wird für jemanden nützlich sein.

<!--Material design primary colors-->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="android:navigationBarColor">@color/primary_dark</item>
    <item name="actionBarTheme">@style/AppBaseTheme.Toolbar</item>
</style>

<!--Action bar-->
<style name="AppBaseTheme.Toolbar" parent="Widget.AppCompat.ActionBar.Solid">
    <item name="android:textColorPrimary">@color/action_bar_text</item>
    <item name="colorControlNormal">@color/action_bar_text</item>
</style>

7

Viele Antworten sind veraltet, daher werde ich den Thread aktualisieren und zeigen, wie Textfarbe und Hintergrundfarbe in ActionBar (Symbolleiste) und im ActionBar-Popup-Menü geändert werden.

Der neueste Ansatz in Android (Stand Mai 2018) bei der Arbeit mit der Aktionsleiste (Symbolleiste) besteht darin, das Thema mit NoActionBar zu verwenden und stattdessen die Symbolleiste zu verwenden.

Also hier ist was du brauchst:

  1. In Aktivität (die AppCompatActivity erweitert) deklarieren Sie die Symbolleiste:

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);
  2. Fügen Sie die Symbolleiste in die Layout-XML der Aktivität ein. Hier werden wir unsere benutzerdefinierten (überschriebenen Themen) festlegen, notieren android:theme="@style/ThemeOverlay.AppTheme.ActionBar"und app:popupTheme="@style/ThemeOverlay.AppTheme.PopupMenu"sie werden den Trick machen.

    <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppTheme.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppTheme.PopupMenu"
    app:layout_constraintTop_toTopOf="parent" />
  3. In Ihrer styles.xml müssen Sie diese beiden Stile überschreiben, um benutzerdefinierte Farben festzulegen:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionBarTheme">@style/ThemeOverlay.AppTheme.ActionBar</item>
    <item name="actionBarPopupTheme">@style/ThemeOverlay.AppTheme.PopupMenu</item>
    </style>
    
    <style name="ThemeOverlay.AppTheme.ActionBar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:textColorPrimary">@color/action_bar_text_color</item>
    <item name="android:background">@color/action_bar_bg_color</item>
    </style>
    
    <style name="ThemeOverlay.AppTheme.PopupMenu" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">@color/popup_bg_color</item>
    <item name="android:textColorPrimary">@color/popup_text_color</item>
    </style>

Das ist es Leute

ps wenn du mich fragst würde ich sagen: JA, diese ganze Themensache ist ein verdammt großes Durcheinander.


5

Dies ist die Lösung, die ich verwendet habe, nachdem ich alle Antworten überprüft habe

<!-- Base application theme. -->
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorAccent">@color/Button_color</item>
    <item name="android:editTextStyle">@style/EditTextStyle</item>
    <item name="android:typeface">monospace</item>
    <item name="android:windowActionBar">true</item>
    <item name="colorPrimary">@color/Title_Bar_Color</item>
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>

</style>

<style name="EditTextStyle" parent="Widget.AppCompat.EditText"/>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <item name="titleTextStyle">@style/ActionBarTitleText</item>
    <item name="android:background">@color/Title_Bar_Color</item>
    <item name="background">@color/Title_Bar_Color</item>
    <item name="subtitleTextStyle">@style/ActionBarSubTitleText</item>
</style>

<style name="ActionBarTitleText" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="android:textColor">@color/solid_white</item>
    <item name="android:textSize">12sp</item>
</style>

<style name="ActionBarSubTitleText" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle">
    <item name="android:textColor">@color/solid_white</item>
    <item name="android:textSize">12sp</item>
</style>

Ändern Sie die gewünschten Farben, damit es funktioniert


4

Diese Funktion funktioniert gut

private void setActionbarTextColor(ActionBar actBar, int color) {

    String title = actBar.getTitle().toString();
    Spannable spannablerTitle = new SpannableString(title);
    spannablerTitle.setSpan(new ForegroundColorSpan(color), 0, spannablerTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    actBar.setTitle(spannablerTitle);

}

Um es dann zu benutzen, füttere es einfach mit deiner Aktionsleiste und der neuen Farbe, dh

ActionBar actionBar = getActionBar();    // Or getSupportActionBar() if using appCompat
int red = Color.RED
setActionbarTextColor(actionBar, red);

4

Versuchen Sie, dies in onCreate Ihrer Aktivität einzufügen. Funktioniert auf fast jeder Android-Version.

 actionBar.setTitle(Html.fromHtml("<font color='#ffff00'>Your Title</font>"));  

oder

getSupportActionBar().setTitle(Html.fromHtml("<font color='#ffff00'>Your Title</font>"));

Sie sollten eine Zeichenfolge wie folgt einfügen: Zeichenfolge colouredTitle = "<font color = '# FFFFFF'>" + Your_Title + "</ font>"; Html.fromHtml (colouredTitle);
Tincho825

2

Probieren Sie viele Methoden aus. In der niedrigen Version der API ist eine praktikable Methode <item name="actionMenuTextColor">@color/your_color</item>und verwenden Sie nicht den Android-Namespace. Ich hoffe, Sie können Ihnen helfen

ps:

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionMenuTextColor">@color/actionMenuTextColor</item>
</style>

1

Setzen Sie dies einfach in Ihren Stil ein.

<item name="android:textColorPrimary">@color/yourcolor</item>



0

Dies ist nicht die empfohlene Lösung, da ich hier in Android Apis gehe, aber da meine Anwendung das Thema dynmisch unter Bedingungen ändern muss, die hier nicht möglich sind, muss ich dies tun. Aber diese Lösung funktioniert sehr gut.

Lösung:--

 /**
 * 
 * @author Kailash Dabhi
 * @email kailash09dabhi@gmail.com
 *
 */ 
 public static void setActionbarTextColor(Activity activity, int color) {
    Field mActionViewField;
    try {
        mActionViewField = activity.getActionBar().getClass()
                .getDeclaredField("mActionView");
        mActionViewField.setAccessible(true);
        Object mActionViewObj = mActionViewField.get(activity
                .getActionBar());

        Field mTitleViewField = mActionViewObj.getClass().getDeclaredField(
                "mTitleView");
        mTitleViewField.setAccessible(true);
        Object mTitleViewObj = mTitleViewField.get(mActionViewObj);

        TextView mActionBarTitle = (TextView) mTitleViewObj;
        mActionBarTitle.setTextColor(color);
        // Log.i("field", mActionViewObj.getClass().getName());
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    }

}

0

Für Android 5 (Lollipop) müssen Sie android: actionBarPopupTheme verwenden , um die Textfarbe für das Überlaufmenü festzulegen .


0

Der einfachste Weg ist:
Fügen Sie diese beiden Zeilen zu Ihrer Datei styles.xml hinzu

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

Ersetzen Sie die Farbe durch Ihre Farbe.


-1

Sie können die Farbe eines beliebigen Textes ändern, indem Sie das HTML- <font>Attribut direkt in xmlDateien verwenden. zum Beispiel in strings.xml:

<resources>
    <string name = "app_name">
        <html><font color="#001aff">Multi</font></html>
        <html><font color="#ff0044">color</font></html>
        <html><font color="#e9c309">Text </font></html>
    </string>
</resources>

Geben Sie hier die Bildbeschreibung ein

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.