Cor do texto do ActionBar

288

como posso alterar a cor do texto do ActionBar? Como herdei o Tema Holo Light, sou capaz de alterar o plano de fundo da ActionBar, mas não descubro qual é o atributo a ser alterado para alterar a cor do texto.


Ok, sou capaz de alterar a cor do texto com o atributo android: textColorPrimary, mas também altera a cor do texto do menu suspenso exibido quando ocorre um estouro nos botões do ActionBar. Alguma idéia de como alterar a cor desses menus / lista?

agora
fonte
acabou de publicar uma solução que funcionou para mim. Veja aqui stackoverflow.com/a/16175220/627827
spaceMonkey

Respostas:

447

Ok, eu encontrei uma maneira melhor. Agora só consigo alterar a cor do título. Você também pode ajustar a legenda.

Aqui está o meu 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>
agora
fonte
32
Esta é a maneira correta. No entanto, para obter consistência, você deve herdar de Widget.Holo.Light.ActionBarfor MyTheme.ActionBarStyle.
Jake Wharton
7
Não vai construir - ADT reclama que requer v13 ou superior (assim ... não vai funcionar na maioria dos aparelhos Android :()
Adam
8
@ Adam Eu tive o mesmo problema, mas a próxima resposta funciona para mim - em vez de parent = "@ android: style / TextAppearance.Holo.Widget.ActionBar.Title" use parent = "@ android: style / TextAppearance"
bkurzius
8
Se você estiver usando a biblioteca Appcompat, substitua o Holo por AppCompat. Funciona
sha
3
@LOG_TAG Use Widget.AppCompat.Light.ActionBar
sha
97

Eu encontrei uma maneira que funciona bem com qualquer sabor de ActionBar( Sherlock , Compat e Native ):

Basta usar o html para definir o título e especificar a cor do texto. Por exemplo, para definir a cor do texto do ActionBar como vermelho, basta fazer o seguinte:

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

Você também pode usar o código hexadecimal vermelho em #FF0000vez da palavra red. Se você estiver tendo problemas com isso, consulte Android Html.fromHtml (String) não funciona para o <font color = '#'> texto </font> .


Além disso, se você deseja usar um recurso de cores, esse código pode ser usado para obter a seqüência HEX correta e remover o alfa, se necessário (a tag da fonte não suporta 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
fonte
Isso gera um erro porque você precisa inserir uma string no método Html.fromHtml () e está colocando vários parâmetros no método. Ao substituir o "," por "+", isso funciona perfeitamente :-).
Pinyin_samu 03/11/2013
3
Após décadas de pesquisa, esta é a solução mais fácil! Bom trabalho!
bmkay
2
@ MSI, você também pode usar valores hexadecimais, basta substituir redpor " + color + ".
Phil
1
@MSI, você pode tentar o que este post sugere (também atualizou minha pergunta)? Apenas substitua #FF0000por "+color+".
Phil Phil
1
Obrigado Phil. Está funcionando perfeitamente! Tentei da seguinte maneira: getSupportActionBar (). SetTitle (Html.fromHtml ("<font color = '" + color + "'>" + "Home" + "</font>")); Apenas tem que usar 'no lugar de \.
precisa saber é o seguinte
93

Eu estava tendo o mesmo problema que você, é um tema Holo.Light, mas queria estilizar a cor do ActionBar, por isso também precisava alterar a cor do texto e também o título e os menus. Então, no final, fui ao git hub e examinei o código-fonte até encontrar o maldito estilo correto:

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

agora tudo que você tem a fazer é definir o que quer @color/actionBarTexte @drawable/actionbarbgroundvocê quer!

Budius
fonte
Onde eu tenho que usar esse xml? valores ou valores-v11 ou valores v-14 ??
DroidLearner
a resposta é de fev / 2012, não havia V14 na época. Então V11 com certeza.
Budius 17/03/2013
abaixo de 3,0, o sistema não possui uma actionBar.
Budius 18/03/2013
Estou usando a Action Bar Sherlock e encontrei a solução. Obrigado :)
DroidLearner
3
para o sherlock da barra de ação, você deve usar os nomes específicos da barra de ação e usar este gerador: jgilfelt.github.com/android-actionbarstylegenerator Sempre o usamos onde trabalho. É muito bom
Budius 18/03/2013
67

O ID da ActionBar não está disponível diretamente, então você precisa fazer um pouco de hacking aqui.

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
fonte
1
NullPointerExceptionnesta linhaactionBarTextView.setTextColor(Color.RED);
DroidLearner 18/03
3
Caso você esteja executando o nível de API <11, ActionBarSherlock e deseje salvar uma chamada cara getIndentifier(), pode procurar (TextView) findViewById(com.actionbarsherlock.R.id.abs__action_bar_title);primeiro (verifique se não é nulo).
22413 Andre
"O ID da ActionBar não está disponível diretamente", na verdade, no meu caso, a barra de ferramentas é facilmente acessível, como Toolbar toolbar = findViewById(R.id.toolbar);no arquivo de layout xml, ela é cercada por com.google.android.material.appbar.AppBarLayoutelemento, entãotoolbar.setTitleTextColor( getResources().getColor( R.color.colorViolet ) );
YoussefDir
32

É um tópico antigo, mas para futuros leitores, o uso da Barra de Ferramentas facilita tudo:

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

eu fiz com um código de linha simples

actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>"));
MilapTank
fonte
Não é isto, essencialmente, um duplicado da resposta dada acima: stackoverflow.com/a/19592911/1992342
mike47
Parece um patch.
Bertram Gilfoyle
28

Adicione-o à raiz da barra de ação. Eu tive esse 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 - altera a cor do texto da barra de ação, nunca funcionou quando fazia parte do Widget.Styled.ActionBar, então tive que adicioná-lo à raiz. Outros 2 atributos alteram o título e a legenda de uma barra de ação.

Nabdreas
fonte
Use "android: actionMenuTextColor" em vez de "actionMenuTextColor". :)
AnkitRox
20

Definir uma string HTML na barra de ação não funciona no tema Material no SDK v21 +

Se você quiser alterá-lo, defina a cor do texto principal em seu 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
fonte
1
Isso altera a cor principal do texto em qualquer lugar do aplicativo!
Mohammed
16

A maneira mais direta é fazer isso no styles.xml.

No momento, o modelo styles.xml do Google gera o seguinte:

<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 você adicionar mais uma linha antes da tag de fechamento, como mostrado, isso mudará a cor do texto para o que deveria ser com um 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 quiser personalizar a cor para outra coisa, você pode especificar sua própria cor em colors.xml ou até mesmo usar uma cor interna do Android usando o 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: Isso altera a cor do título e também os títulos de quaisquer itens de menu exibidos na ActionBar.

Sam
fonte
12

Se você quiser estilizar a legenda também, basta adicioná-la ao seu estilo personalizado.

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

Pessoas que desejam obter o mesmo resultado para a AppCompatbiblioteca, é isso que eu usei:

<?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
fonte
Estou tentando um tema claro, barra de ação escura e texto em branco. Seu código é a única coisa que encontrei até agora que tem algum efeito, mas torna toda a barra de ação branca. Alguma ideia do que está acontecendo? Sim, eu sei que isso tem um ano e meio. :-)
nasch
Isso me ajudou a resolver meu problema. Eu só precisava adicionar os dois<item name="android:titleTextStyle"> e <item name="titleTextStyle"> porque estava usando a biblioteca de suporte do appcompat.
Rock Lee
o título desaparece
jairhumberto 24/12/19
8

Encontrei o caminho certo para fazer isso sem criar seu próprio layout na API> = 21.

Ele somente colorirá os textos e controlará os drawables dentro da barra de ação.

Espero que seja útil para alguém.

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

Muitas respostas foram descontinuadas, então atualizarei o tópico e mostrarei como alterar a cor do texto e a cor do plano de fundo na ActionBar (Barra de Ferramentas) e no menu pop-up da ActionBar.

A abordagem mais recente no Android (a partir de maio de 2018) ao trabalhar com a barra de ação (barra de ferramentas) é usar o tema com NoActionBar e usar a barra de ferramentas.

então aqui está o que você precisa:

  1. Em Atividade (que estende AppCompatActivity), declare a Barra de Ferramentas:

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);
  2. Adicione a barra de ferramentas no xml de layout da atividade. Aqui, definiremos nossos temas personalizados (sobrescritos), observação android:theme="@style/ThemeOverlay.AppTheme.ActionBar"e app:popupTheme="@style/ThemeOverlay.AppTheme.PopupMenu", eles farão o truque.

    <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. No seu styles.xml, você precisará substituir esses dois estilos para definir cores personalizadas:

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

É isso aí pessoal

ps se você me perguntar, eu diria: SIM, esse tema todo é uma bagunça.

Kirill Karmazin
fonte
5

Esta é a solução que usei depois de verificar todas as respostas

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

Mude as cores necessárias para que funcione

Smaran
fonte
4

Esta função funciona bem

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

}

em seguida, use-o apenas alimente sua barra de ação e a nova cor, ou seja

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

Tente adicionar isso no onCreate da sua atividade. Funciona em quase todas as versões do Android.

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

ou

getSupportActionBar().setTitle(Html.fromHtml("<font color='#ffff00'>Your Title</font>"));
onexf
fonte
Você deve colocar uma string como esta: String coloredTitle = "<font color = '# FFFFFF'>" + Seu_Título + "</font>"; Html.fromHtml (coloredTitle);
Tincho825 28/01/19
2

Experimente vários métodos, na versão baixa da API, um método viável é <item name="actionMenuTextColor">@color/your_color</item>e não use o espaço para nome Android, a esperança pode ajudá-lo

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

basta colocar isso no seu estilo thme.

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

Ali Keb
fonte
0

Esta não é a solução recomendada, pois eu estou indo nas APIs do Android aqui, mas como o meu aplicativo exige que você mude dinamicamente o tema, as condições xml não são possíveis aqui, por isso preciso fazer isso. Mas esta solução está funcionando muito bem.

Solução:--

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

Para o Android 5 (pirulito), você terá que usar android: actionBarPopupTheme para definir o textColor para o menu de estouro.

m02ph3u5
fonte
0

A maneira mais simples é:
adicione essas duas linhas ao seu arquivo 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>

Substitua a cor pela sua cor.

Ali Najafi
fonte
-1

você pode alterar a cor de qualquer texto usando o atributo html<font> diretamente nos xmlarquivos. por exemplo em 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>

insira a descrição da imagem aqui

hofs
fonte