Couleur du texte ActionBar

288

comment puis-je changer la couleur du texte de l'ActionBar? J'ai hérité du Holo Light Theme, je peux changer l'arrière-plan de l'ActionBar mais je ne sais pas quel est l'attribut à modifier pour changer la couleur du texte.


Ok, je peux changer la couleur du texte avec l'attribut android: textColorPrimary mais cela change également la couleur du texte du menu déroulant affiché lorsqu'un débordement se produit sur les boutons ActionBar. Une idée comment changer la couleur de ces menu déroulant / liste?

rnoway
la source
vient de publier une solution qui a fonctionné pour moi. voir ici stackoverflow.com/a/16175220/627827
spaceMonkey

Réponses:

447

Ok, j'ai trouvé un meilleur moyen. Je ne peux maintenant changer que la couleur du titre. Vous pouvez également modifier le sous-titre.

Voici mon 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>
rnoway
la source
32
C'est la bonne façon. Cependant, pour des raisons de cohérence, vous devez hériter de Widget.Holo.Light.ActionBarfor MyTheme.ActionBarStyle.
Jake Wharton
7
Ne se construit pas - ADT se plaint qu'il nécessite une version 13 ou supérieure (donc ... ne fonctionnera pas sur la plupart des combinés Android :()
Adam
8
@Adam J'ai eu le même problème, mais la réponse suivante fonctionne pour moi - au lieu de parent = "@ android: style / TextAppearance.Holo.Widget.ActionBar.Title" use parent = "@ android: style / TextAppearance"
bkurzius
8
Si vous utilisez la bibliothèque Appcompat, remplacez Holo par AppCompat. Cela fonctionne
sha
3
@LOG_TAG Use Widget.AppCompat.Light.ActionBar
sha
97

J'ai trouvé un moyen qui fonctionne bien avec n'importe quelle saveur de ActionBar( Sherlock , Compat et Native ):

Utilisez simplement html pour définir le titre et spécifiez la couleur du texte. Par exemple, pour définir la couleur du texte ActionBar sur rouge, procédez simplement comme suit:

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

Vous pouvez également utiliser le code hexadécimal rouge #FF0000au lieu du mot red. Si vous rencontrez des problèmes avec cela, consultez Android Html.fromHtml (String) ne fonctionne pas pour le <font color = '#'> texte </font> .


De plus, si vous souhaitez utiliser une ressource de couleur, ce code peut être utilisé pour obtenir la chaîne HEX correcte et supprimer l'alpha si nécessaire (la balise de police ne prend pas en charge l'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))));
Phil
la source
Cela donne une erreur car vous devez mettre une chaîne dans la méthode Html.fromHtml () et vous placez plusieurs paramètres dans la méthode. En remplaçant le "," par "+" cela fonctionne parfaitement :-).
pinyin_samu
3
Après des décennies de recherche, c'est la solution la plus simple! Bon travail!
bmkay
2
@MSI, vous pouvez également utiliser des valeurs hexadécimales, remplacez simplement redpar " + color + ".
Phil
1
@MSI, pouvez-vous essayer ce que ce post suggère (également mis à jour ma question)? Remplacez simplement #FF0000par "+color+".
Phil
1
Merci Phil. Cela fonctionne parfaitement! J'ai essayé de cette manière: getSupportActionBar (). SetTitle (Html.fromHtml ("<font color = '" + color + "'>" + "Home" + "</font>")); Il suffit d'utiliser "à la place de \.
MSIslam
93

J'avais le même problème que vous, c'est un thème Holo.Light mais je voulais styliser la couleur ActionBar, donc je devais changer la couleur du texte ainsi que le titre et les menus. Donc à la fin, je suis allé sur git hub et j'ai regardé le code source jusqu'à ce que je trouve le style sacrément correct:

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

Alors maintenant, tout ce que vous avez à faire est de définir quoi @color/actionBarTextque ce soit et que @drawable/actionbarbgroundvous voulez!

Budius
la source
Où dois-je utiliser ce xml? valeurs ou valeurs-v11 ou valeurs v-14 ??
DroidLearner
la réponse est de février / 2012, il n'y avait pas de V14 à l'heure. Donc, V11 à coup sûr.
Budius
en dessous de 3.0, le système n'a pas de barre d'action.
Budius
J'utilise Action Bar Sherlock et j'ai trouvé la solution. Merci :)
DroidLearner
3
pour le sherlock de la barre d'action, vous devez utiliser les noms spécifiques de la barre d'action et vous pouvez utiliser ce générateur: jgilfelt.github.com/android-actionbarstylegenerator Nous l'utilisons toujours là où je travaille. C'est très bon
Budius
67

L'ID ActionBar n'est pas disponible directement, vous devez donc faire un peu de piratage ici.

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);
    }
}
Abhishek Chauhan
la source
1
NullPointerExceptionsur cette ligneactionBarTextView.setTextColor(Color.RED);
DroidLearner
3
Si vous exécutez le niveau d'API <11, ActionBarSherlock et que vous souhaitez vous éviter un appel coûteux getIndentifier(), vous pouvez d'abord regarder (TextView) findViewById(com.actionbarsherlock.R.id.abs__action_bar_title);(assurez-vous de vérifier s'il n'est pas nul).
Andre
"L'ID ActionBar n'est pas disponible directement" en fait dans mon cas, la barre d'outils est facilement accessible comme Toolbar toolbar = findViewById(R.id.toolbar);là où dans le fichier de mise en page xml elle est entourée par un com.google.android.material.appbar.AppBarLayoutélément, alorstoolbar.setTitleTextColor( getResources().getColor( R.color.colorViolet ) );
YoussefDir
32

C'est un vieux sujet mais pour les futurs lecteurs, utiliser ToolBar rend tout très simple:

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

je l'ai fait avec un simple code d'une ligne

actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>"));
MilapTank
la source
N'est-ce pas essentiellement un doublon de la réponse donnée ci-dessus: stackoverflow.com/a/19592911/1992342
mike47
On dirait un patch.
Bertram Gilfoyle
28

Ajoutez-le à la racine de la barre d'actions. J'ai eu ce problème.

<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 - change la couleur du texte pour le texte de la barre d'action, cela n'a jamais fonctionné quand il faisait partie du Widget.Styled.ActionBar, j'ai donc dû l'ajouter à la racine. Les 2 autres attributs changent le titre et le sous-titre d'une barre d'action.

Nabdreas
la source
Utilisez "android: actionMenuTextColor" au lieu de "actionMenuTextColor". :)
AnkitRox
20

La définition d'une chaîne HTML dans la barre d'action ne fonctionne pas sur le thème Matériau dans le SDK v21 +

Si vous souhaitez le modifier, vous devez définir la couleur de texte principale dans votre 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>    
Koen Hendriks
la source
1
Cela change la couleur principale du texte partout dans l'application!
Mohammed
16

La façon la plus simple est de le faire dans le styles.xml.

Le modèle styles.xml de Google génère actuellement les éléments suivants:

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

Si vous ajoutez une ligne de plus avant la balise de fermeture, comme indiqué, cela changera la couleur du texte en ce qu'elle devrait être avec un 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>

Si vous souhaitez personnaliser la couleur à autre chose, vous pouvez soit spécifier votre propre couleur dans colors.xml ou même utiliser une couleur intégrée d'Android en utilisant l'attribut 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>

Remarque: cela modifie la couleur du titre ainsi que les titres des éléments MenuItems affichés dans l'ActionBar.

Sam
la source
12

Si vous souhaitez également styler le sous-titre, ajoutez-le simplement dans votre style personnalisé.

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

Les gens qui cherchent à obtenir le même résultat pour la AppCompatbibliothèque, c'est ce que j'ai utilisé:

<?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>
Tarun
la source
J'essaie un thème clair, une barre d'action sombre et du texte blanc. Votre code est la seule chose que j'ai trouvée jusqu'à présent qui ait un effet, mais il rend toute la barre d'action blanche. Une idée de ce qui pourrait se passer? Oui, je sais que cela fait un an et demi. :-)
nasch
Cela m'a aidé à résoudre mon problème. J'avais juste besoin d'ajouter les deux <item name="android:titleTextStyle"> et <item name="titleTextStyle"> parce que j'utilisais la bibliothèque de support compatible avec l'application.
Rock Lee
le titre disparaît
jairhumberto
8

J'ai trouvé le moyen de le faire correctement sans créer votre propre mise en page sur l'API> = 21.

Il ne colorise que les textes et contrôle les tirages à l'intérieur de la barre d'action.

J'espère que cela sera utile pour quelqu'un.

<!--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>
moissonneuse
la source
7

Beaucoup de réponses sont obsolètes, je vais donc mettre à jour le fil et montrer comment changer la couleur du texte et la couleur d'arrière-plan dans ActionBar (barre d'outils) et dans le menu contextuel ActionBar.

La dernière approche d'Android (en mai 2018) pour travailler avec la barre d'action (barre d'outils) consiste à utiliser le thème avec NoActionBar et à utiliser la barre d'outils à la place.

voici donc ce dont vous avez besoin:

  1. Dans Activity (qui étend AppCompatActivity), déclarez la barre d'outils:

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);
  2. Ajoutez la barre d'outils dans le xml de mise en page de l'activité. Ici, nous allons définir notre personnalisation (thèmes remplacés), noter android:theme="@style/ThemeOverlay.AppTheme.ActionBar"et app:popupTheme="@style/ThemeOverlay.AppTheme.PopupMenu", ils feront l'affaire.

    <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. Dans votre styles.xml, vous devrez remplacer ces deux styles pour définir des couleurs personnalisées:

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

C'est ça les amis

ps si vous me demandez, je dirais: OUI, tout ce thème est un sacré bordel.

Kirill Karmazin
la source
5

C'est la solution que j'ai utilisée après avoir vérifié toutes les réponses

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

Modifiez les couleurs requises, cela fonctionnera

Smaran
la source
4

Cette fonction fonctionne bien

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

}

puis pour l'utiliser, il suffit de nourrir votre barre d'action et la nouvelle couleur ie

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

Essayez d'ajouter ceci dans le onCreate de votre activité. Fonctionne sur presque toutes les versions d'Android.

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

ou

getSupportActionBar().setTitle(Html.fromHtml("<font color='#ffff00'>Your Title</font>"));
onexf
la source
Vous devez mettre une chaîne comme celle-ci: String colouredTitle = "<font color = '# FFFFFF'>" + Your_Title + "</font>"; Html.fromHtml (coloréTitre);
Tincho825
2

Essayez beaucoup de méthodes, dans la version basse de l'API, une méthode possible est <item name="actionMenuTextColor">@color/your_color</item>et n'utilisez pas l'espace de noms Android, j'espère que cela peut vous aider

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>
BoBoMEe
la source
1

il suffit de mettre cela dans votre style.

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

Ali Keb
la source
0

Une bonne solution consiste à utiliser un SpannableStringBuilder et à définir la couleur de cette façon. Vous pouvez même utiliser différentes couleurs sur différentes parties de la chaîne, ajouter des images, etc.

Testé avec la nouvelle bibliothèque de support.

Voir Android: colorier une partie d'une chaîne à l'aide de TextView.setText ()?

Maciej Swic
la source
0

Ce n'est pas la solution recommandée car je vais dans les API Android ici mais comme mon application nécessite de changer le thème de manière dynmique dans des conditions xml pas possibles ici, donc je dois le faire. Mais cette solution fonctionne très bien.

Solution:--

 /**
 * 
 * @author Kailash Dabhi
 * @email [email protected]
 *
 */ 
 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();
    }

}
Kailash Dabhi
la source
0

Pour Android 5 (sucette), vous devrez utiliser android: actionBarPopupTheme pour définir la couleur du texte pour le menu de débordement.

m02ph3u5
la source
0

La manière la plus simple est:
Ajoutez ces deux lignes à votre fichier 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>

Remplacez la couleur par votre couleur.

Ali Najafi
la source
-1

vous pouvez changer la couleur de n'importe quel texte en utilisant l' attribut html<font> directement dans les xmlfichiers. par exemple dans 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>

entrez la description de l'image ici

hofs
la source