Colore del testo di ActionBar


288

come posso cambiare il colore del testo di ActionBar? Ho ereditato il tema Holo Light, sono in grado di cambiare lo sfondo di ActionBar ma non scopro quale sia l'attributo da modificare per cambiare il colore del testo.


Ok, sono in grado di cambiare il colore del testo con l'attributo android: textColorPrimary ma cambia anche il colore del testo del menu a discesa visualizzato quando si verifica un overflow sui pulsanti di ActionBar. Qualche idea su come cambiare il colore di quei menu a discesa / Elenco?


ho appena pubblicato una soluzione che ha funzionato per me. vedi qui stackoverflow.com/a/16175220/627827
Spacemonkey

Risposte:


447

Ok, ho trovato un modo migliore. Ora sono in grado di cambiare solo il colore del titolo. Puoi anche modificare i sottotitoli.

Ecco il mio 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
Questo è il modo corretto Tuttavia, per coerenza, dovresti ereditare da Widget.Holo.Light.ActionBarper MyTheme.ActionBarStyle.
Jake Wharton,

7
Non si costruisce - ADT si lamenta che richiede v13 o versioni successive (quindi ... non funzionerà sulla maggior parte dei telefoni Android :()
Adam

8
@Adam Ho avuto lo stesso problema, ma la risposta successiva funziona per me - invece di parent = "@ android: style / TextAppearance.Holo.Widget.ActionBar.Title" use parent = "@ android: style / TextAppearance"
bkurzius

8
Se si utilizza la libreria Appcompat, sostituire Holo con AppCompat. Funziona
sha

3
@LOG_TAG Usa Widget.AppCompat.Light.ActionBar
sha

97

Ho trovato un modo che funziona bene con qualsiasi tipo di ActionBar( Sherlock , Compat e Native ):

Basta usare HTML per impostare il titolo e specificare il colore del testo. Ad esempio, per impostare il colore del testo di ActionBar su rosso, basta fare questo:

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

Puoi anche usare il codice esadecimale rosso #FF0000 invece della parola red. In caso di problemi, consultare Android Html.fromHtml (String) non funziona per <font color = '#'> testo </font> .


Inoltre, se si desidera utilizzare una risorsa colore, questo codice può essere utilizzato per ottenere la stringa HEX corretta e, se necessario, rimuovere l'alfa (il tag del carattere non supporta l'alfa):

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

Questo dà un errore perché devi inserire una stringa nel metodo Html.fromHtml () e stai inserendo più parametri nel metodo. Quando si sostituisce "," con "+" questo funziona perfettamente :-).
pinyin_samu,

3
Dopo decenni di ricerche, questa è la soluzione più semplice! Ottimo lavoro!
bmkay,

2
@MSI, puoi usare anche valori esadecimali, basta sostituirli redcon " + color + ".
Phil

1
@MSI, puoi provare cosa suggerisce questo post (anche aggiornato la mia domanda)? Sostituisci #FF0000con "+color+".
Phil

1
Grazie Phil. Funziona perfettamente! Ho provato in questo modo: getSupportActionBar (). SetTitle (Html.fromHtml ("<font color = '" + color + "'>" + "Home" + "</font>")); Deve solo usare 'al posto di \.
MSIslam,

93

Avevo lo stesso problema che hai tu, è un tema Holo.Light ma volevo dare uno stile al colore ActionBar, quindi dovevo cambiare anche il colore del testo e anche il titolo e i menu. Quindi alla fine sono andato su git hub e ho guardato il codice sorgente fino a trovare lo stile dannatamente corretto:

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

così ora tutto quello che dovete fare è impostare tutto ciò @color/actionBarTexte @drawable/actionbarbgroundche vuoi!


Dove devo usare questo xml? valori o valori-v11 o valori v-14 ??
DroidLearner

la risposta è di febbraio / 2012, non c'era V14 al momento. Quindi V11 di sicuro.
Budius,

sotto 3.0 il sistema non ha una actionbar.
Budius,

Sto usando Action Bar Sherlock e ho trovato la soluzione. Grazie :)
DroidLearner

3
per actionbar sherlock devi usare i nomi specifici di actionbar e puoi usare questo generatore: jgilfelt.github.com/android-actionbarstylegenerator Lo usiamo sempre dove lavoro. È molto buono
Budius,

67

L'ID ActionBar non è disponibile direttamente, quindi devi fare un po 'di hacking qui.

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
NullPointerExceptionsu questa lineaactionBarTextView.setTextColor(Color.RED);
DroidLearner

3
Nel caso in cui utilizzi il livello API <11, ActionBarSherlock e desideri salvarti una chiamata costosa getIndentifier(), puoi (TextView) findViewById(com.actionbarsherlock.R.id.abs__action_bar_title);prima cercare (assicurati di controllare se non è nullo).
Andre

"L'ID ActionBar non è disponibile direttamente" in realtà nel mio caso la barra degli strumenti è facilmente accessibile come Toolbar toolbar = findViewById(R.id.toolbar);nel punto in cui il file di layout XML è circondato da un com.google.android.material.appbar.AppBarLayoutelemento, quinditoolbar.setTitleTextColor( getResources().getColor( R.color.colorViolet ) );
YoussefDir

32

È un argomento vecchio ma per i futuri lettori, l'utilizzo di ToolBar rende tutto molto semplice:

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


28

Aggiungilo alla radice della barra delle azioni. Ho avuto questo problema

<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 - cambia il colore del testo per il testo della barra delle azioni, non ha mai funzionato quando faceva parte del Widget.Styled.ActionBar, quindi ho dovuto aggiungerlo alla radice. Altri 2 attributi cambiano titolo e sottotitolo di una barra delle azioni.


Usa "android: actionMenuTextColor" invece di "actionMenuTextColor". :)
AnkitRox

20

L'impostazione di una stringa HTML sulla barra delle azioni non funziona sul tema Materiale in SDK v21 +

Se si desidera modificarlo, è necessario impostare il colore del testo principale in style.xml

<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
Questo cambia il colore del testo principale ovunque nell'applicazione!
Mohammed,

16

Il modo più semplice è farlo in styles.xml.

Il modello styles.xml di Google attualmente genera quanto segue:

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

Se aggiungi un'altra riga prima del tag di chiusura, come mostrato, ciò cambierà il colore del testo come dovrebbe essere con una Dark ActionBar:

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

Se vuoi personalizzare il colore con qualcos'altro, puoi specificare il tuo colore in colors.xml o persino usare un colore incorporato da Android usando l'attributo android: textColorPrimary:

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

Nota: questo modifica il colore del titolo e anche i titoli di tutti gli oggetti Menu visualizzati nell'ActionBar.


12

Se vuoi dare uno stile anche ai sottotitoli, aggiungi semplicemente questo nel tuo stile personalizzato.

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

Le persone che stanno cercando di ottenere lo stesso risultato per la AppCompatlibreria, questo è quello che ho usato:

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

Sto cercando un tema chiaro, una barra delle azioni scura e un testo bianco. Il tuo codice è l'unica cosa che ho trovato finora che ha alcun effetto, ma rende bianca l'intera barra delle azioni. Qualche idea di cosa potrebbe succedere? Sì, lo so che ha un anno e mezzo. :-)
nasch

Questo mi ha aiutato a risolvere il mio problema. Avevo solo bisogno di aggiungere entrambi <item name="android:titleTextStyle"> e <item name="titleTextStyle"> perché stavo usando la libreria di supporto di appcompat.
Rock Lee

il titolo scompare
jairhumberto il

9

Ho trovato il modo di farlo bene senza creare il tuo layout su API> = 21.

Colorerà solo i testi e controllerà i disegni nella barra delle azioni.

Spero che sia utile per qualcuno.

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

Molte risposte sono obsolete, quindi aggiornerò il thread e mostrerò come cambiare il colore del testo e il colore di sfondo su ActionBar (barra degli strumenti) e nel menu a comparsa ActionBar.

L'ultimo approccio in Android (a partire da maggio 2018) nel lavorare con la barra delle azioni (barra degli strumenti) è utilizzare il tema con NoActionBar e utilizzare invece la barra degli strumenti.

quindi ecco di cosa hai bisogno:

  1. In Activity (che estende AppCompatActivity) dichiara Toolbar:

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);
  2. Aggiungi barra degli strumenti nel layout xml dell'attività. Qui imposteremo la nostra personalizzazione (temi sovrascritti), nota android:theme="@style/ThemeOverlay.AppTheme.ActionBar"e app:popupTheme="@style/ThemeOverlay.AppTheme.PopupMenu", faranno il trucco.

    <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. Nel tuo styles.xml dovrai sovrascrivere questi due stili per impostare colori personalizzati:

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

Questo è tutto gente

ps se mi chiedi direi: SÌ, tutta questa faccenda a tema è un casino.


5

Questa è la soluzione che ho usato dopo aver controllato tutte le risposte

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

Cambia i colori richiesti funzionerà


4

Questa funzione funziona bene

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

}

quindi per usarlo basta alimentarlo con la barra delle azioni e il nuovo colore, ad es

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

4

Prova ad aggiungere questo in onCreate della tua attività. Funziona su quasi tutte le versioni di Android.

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

o

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

Dovresti inserire una stringa come questa: String coloredTitle = "<font color = '# FFFFFF'>" + Your_Title + "</font>"; Html.fromHtml (coloredTitle);
Tincho825,

2

Prova molti metodi, nella versione bassa dell'API, è un metodo fattibile <item name="actionMenuTextColor">@color/your_color</item> e non utilizzare lo spazio dei nomi Android, la speranza può aiutarti

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

mettilo nel tuo stile.

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



0

Questa non è la soluzione raccomandata mentre sto andando in apis Android qui, ma poiché la mia applicazione richiede di cambiare il tema dinamicamente in condizioni xml non possibili qui, quindi ho bisogno di farlo. Ma questa soluzione funziona molto bene.

Soluzione:--

 /**
 * 
 * @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

Per Android 5 (lecca-lecca) dovrai usare android: actionBarPopupTheme per impostare textColor per il menu di overflow.


0

Il modo più semplice è:
aggiungi queste due righe al tuo file styles.xml

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

Sostituisci il colore con il tuo colore.


-1

puoi cambiare il colore di qualsiasi testo usando l' attributo html<font> direttamente nei xmlfile. ad esempio 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>

inserisci qui la descrizione dell'immagine

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.