Color del texto de ActionBar

288

¿Cómo puedo cambiar el color del texto de ActionBar? Heredé el Holo Light Theme, puedo cambiar el fondo de ActionBar, pero no sé cuál es el atributo para ajustar para cambiar el color del texto.


Ok, puedo cambiar el color del texto con el atributo android: textColorPrimary pero también cambia el color del texto del menú desplegable que se muestra cuando se produce un desbordamiento en los botones de la barra de acciones. ¿Alguna idea de cómo cambiar el color de ese menú desplegable / Lista?

rnoway
fuente
Acabo de publicar una solución que funcionó para mí. ver aquí stackoverflow.com/a/16175220/627827
spaceMonkey

Respuestas:

447

Ok, he encontrado una mejor manera. Ahora solo puedo cambiar el color del título. También puedes modificar el subtítulo.

Aquí está mi 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
fuente
32
Esta es la forma correcta. Sin embargo, por coherencia, debe heredar de Widget.Holo.Light.ActionBarfor MyTheme.ActionBarStyle.
Jake Wharton
77
No se compilará: ADT se queja de que requiere v13 o superior (así que ... no funcionará en la mayoría de los teléfonos Android :()
Adam
8
@ Adam, tuve el mismo problema, pero la siguiente respuesta funciona para mí, en lugar de parent = "@ android: style / TextAppearance.Holo.Widget.ActionBar.Title" use parent = "@ android: style / TextAppearance"
bkurzius
8
Si está utilizando la biblioteca Appcompat, reemplace Holo con AppCompat. Funciona
sha
3
@LOG_TAG Use Widget.AppCompat.Light.ActionBar
sha
97

Encontré una forma que funciona bien con cualquier sabor de ActionBar( Sherlock , Compat y Native ):

Simplemente use html para establecer el título y especifique el color del texto. Por ejemplo, para establecer el color del texto de la Barra de acciones en rojo, simplemente haga esto:

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

También puede usar el código hexadecimal rojo en #FF0000lugar de la palabra red. Si tiene problemas con esto, consulte Android Html.fromHtml (String) no funciona para <font color = '#'> texto </font> .


Además, si desea usar un recurso de color, este código se puede usar para obtener la cadena HEX correcta y eliminar el alfa si es necesario (la etiqueta de fuente no admite 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))));
Phil
fuente
Esto da un error porque tiene que poner una cadena en el método Html.fromHtml (), y está colocando múltiples parámetros en el método. Al reemplazar "," por "+" esto funciona perfectamente :-).
pinyin_samu
3
¡Después de décadas de búsqueda, esta es la solución más fácil! ¡Gran trabajo!
bmkay
2
@MSI, también puedes usar valores hexadecimales, solo reemplaza redcon " + color + ".
Phil
1
@MSI, ¿puedes probar lo que sugiere esta publicación (también actualicé mi pregunta)? Simplemente reemplace #FF0000con "+color+".
Phil
1
Gracias Phil ¡Funciona perfecto! Lo intenté de esta manera: getSupportActionBar (). SetTitle (Html.fromHtml ("<font color = '" + color + "'>" + "Home" + "</font>")); Solo tiene que usar 'en lugar de \.
MSIslam
93

Estaba teniendo el mismo problema que tú, es un tema Holo.Light pero quería diseñar el color de la barra de acción, así que también necesitaba cambiar el color del texto y también el título y los menús. Así que al final fui a git hub y miré el código fuente hasta que encontré el maldito estilo correcto:

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

por lo que ahora todo lo que tiene que hacer es crear lo que sea @color/actionBarTexty @drawable/actionbarbgroundque usted quiera!

Budius
fuente
¿Dónde tengo que usar este xml? valores o valores-v11 o valores v-14 ??
DroidLearner
la respuesta es de febrero de 2012, no había V14 en el momento. Entonces V11 seguro.
Budius
por debajo de 3.0, el sistema no tiene una barra de acción.
Budius
Estoy usando Action Bar Sherlock y encontré la solución. Gracias :)
DroidLearner
3
para actionbar sherlock, debe usar los nombres específicos de la barra de acción y puede usar este generador: jgilfelt.github.com/android-actionbarstylegenerator Siempre lo usamos donde trabajo. Es muy bueno
Budius
67

La ID de ActionBar no está disponible directamente, por lo que debe hacer un poco de pirateo aquí.

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
fuente
1
NullPointerExceptionen esta líneaactionBarTextView.setTextColor(Color.RED);
DroidLearner
3
En caso de que esté ejecutando el nivel de API <11, ActionBarSherlock y le gustaría ahorrarse una llamada costosa getIndentifier(), puede consultar (TextView) findViewById(com.actionbarsherlock.R.id.abs__action_bar_title);primero (asegúrese de verificar si no es nulo).
Andre
"La ID de ActionBar no está disponible directamente" en realidad en mi caso, la barra de herramientas es fácilmente accesible, como Toolbar toolbar = findViewById(R.id.toolbar);en qué parte del archivo de diseño xml está rodeada por un com.google.android.material.appbar.AppBarLayoutelemento, entoncestoolbar.setTitleTextColor( getResources().getColor( R.color.colorViolet ) );
YoussefDir
32

Es un tema antiguo, pero para futuros lectores, usar ToolBar hace que todo sea muy fácil:

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

Lo he hecho con un código simple de una línea

actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>"));
MilapTank
fuente
¿No es esto esencialmente un duplicado de la respuesta dada anteriormente: stackoverflow.com/a/19592911/1992342
mike47 el
Parece un parche.
Bertram Gilfoyle
28

Agréguelo a la raíz de la barra de acción. Tuve este 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 el color del texto para el texto de la barra de acción, nunca funcionó cuando era parte de la Widget.Styled.ActionBar, por lo que tuve que agregarlo a la raíz. Otros 2 atributos cambian el título y los subtítulos de una barra de acción.

Nabdreas
fuente
Utilice "android: actionMenuTextColor" en lugar de "actionMenuTextColor". :)
AnkitRox
20

Establecer una cadena HTML en la barra de acción no funciona en el tema Material en SDK v21 +

Si desea cambiarlo, debe establecer el color del texto primario en su 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
fuente
1
¡Esto cambia el color del texto primario en todas partes de la aplicación!
Mohammed
16

La forma más directa es hacer esto en styles.xml.

La plantilla styles.xml de Google actualmente genera lo siguiente:

<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 agrega una línea más antes de la etiqueta de cierre, como se muestra, eso cambiará el color del texto a lo que debería ser con 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 desea personalizar el color a otra cosa, puede especificar su propio color en colors.xml o incluso usar un color incorporado de Android usando el atributo 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: Esto cambia el color del título y también los títulos de cualquier MenuItems que se muestra en la Barra de acciones.

Sam
fuente
12

Si también quieres darle estilo al subtítulo, simplemente agrega esto en tu estilo personalizado.

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

Las personas que buscan obtener el mismo resultado para la AppCompatbiblioteca, entonces esto es lo que usé:

<?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
fuente
Estoy intentando un tema claro, una barra de acción oscura y un texto blanco. Su código es lo único que he encontrado hasta ahora que tiene algún efecto, pero convierte toda la barra de acción en blanca. ¿Alguna idea de lo que puede estar pasando? Sí, sé que esto tiene un año y medio. :-)
nasch
Esto me ayudó a resolver mi problema. Solo necesitaba agregar ambos <item name="android:titleTextStyle"> y <item name="titleTextStyle"> porque estaba usando la biblioteca de soporte de appcompat.
Rock Lee
el título desaparece
jairhumberto
8

Encontró la manera de hacerlo bien sin crear su propio diseño en API> = 21.

Solo coloreará textos y controlará los elementos dibujables dentro de la barra de acción.

Espero que sea útil para alguien.

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

Muchas respuestas están en desuso, así que actualizaré el hilo y mostraré cómo cambiar el color del texto y el color de fondo en ActionBar (Barra de herramientas) y en el menú emergente ActionBar.

El último enfoque en Android (a partir de mayo de 2018) al trabajar con la barra de acción (barra de herramientas) es usar Theme con NoActionBar y usar Toolbar en su lugar.

así que aquí está lo que necesitas:

  1. En la actividad (que extiende AppCompatActivity) declare la barra de herramientas:

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);
  2. Agregar barra de herramientas en el diseño xml de la actividad. Aquí configuraremos nuestros (temas sobrescritos) personalizados, notas android:theme="@style/ThemeOverlay.AppTheme.ActionBar"y app:popupTheme="@style/ThemeOverlay.AppTheme.PopupMenu", ellos harán el truco.

    <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. En su styles.xml tendrá que sobrescribir esos dos estilos para establecer colores personalizados:

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

Eso es todo amigos

PD: si me preguntas, diría: SÍ, todo este tema es un desastre.

Kirill Karmazin
fuente
5

Esta es la solución que utilicé después de verificar todas las respuestas

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

Cambiar los colores requeridos funcionará

Smaran
fuente
4

Esta funcion funciona 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);

}

luego para usarlo solo alimente su barra de acción y el nuevo color, es decir

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

Intente agregar esto en onCreate de su Actividad. Funciona en casi todas las versiones de Android.

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

o

getSupportActionBar().setTitle(Html.fromHtml("<font color='#ffff00'>Your Title</font>"));
onexf
fuente
Debería poner una cadena como esta: String coloredTitle = "<font color = '# FFFFFF'>" + Your_Title + "</font>"; Html.fromHtml (título de color);
Tincho825
2

Pruebe muchos métodos, en la versión baja de la API, un método factible es <item name="actionMenuTextColor">@color/your_color</item>y no use el espacio de nombres de Android, espero que pueda ayudarlo

PD:

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

solo pon esto en tu estilo.

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

Ali Keb
fuente
0

Esta no es la solución recomendada, ya que voy en apis de Android aquí, pero como mi aplicación requiere cambiar el tema dinámicamente en condiciones xml no posibles aquí, así que necesito hacer esto. Pero esta solución está funcionando muy bien.

Solución:--

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

Para Android 5 (lollipop), deberá usar android: actionBarPopupTheme para configurar textColor para el menú de desbordamiento.

m02ph3u5
fuente
0

La forma más simple es:
agregue estas dos líneas a su archivo 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>

Reemplace el color con su color.

Ali Najafi
fuente
-1

Puede cambiar el color de cualquier texto utilizando el atributo html<font> directamente en los xmlarchivos. por ejemplo en 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>

ingrese la descripción de la imagen aquí

cascos
fuente