Цвет текста ActionBar

288

Как я могу изменить цвет текста панели действий? Я унаследовал тему Holo Light, я могу изменить фон ActionBar, но я не выяснил, что является атрибутом для изменения цвета текста.


Хорошо, я могу изменить цвет текста с помощью атрибута android: textColorPrimary, но он также меняет цвет текста раскрывающегося меню, отображаемого при переполнении кнопок ActionBar. Есть идеи, как изменить цвет выпадающего меню / списка?

rnoway
источник
только что опубликовал решение, которое работает для меня. смотрите здесь stackoverflow.com/a/16175220/627827
spaceMonkey

Ответы:

447

Хорошо, я нашел лучший способ. Теперь я могу изменить только цвет заголовка. Вы также можете настроить субтитры.

Вот мой файл 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
источник
32
Это правильный путь. Однако для согласованности вы должны наследовать от Widget.Holo.Light.ActionBarfor MyTheme.ActionBarStyle.
Джейк Уортон
7
Не будет строить - ADT жалуется, что ему требуется версия 13 или выше (поэтому ... не будет работать на большинстве телефонов Android :()
Адам
8
@ Adam У меня была та же проблема, но следующий ответ работает для меня - вместо parent = "@ android: style / TextAppearance.Holo.Widget.ActionBar.Title" use parent = "@ android: style / TextAppearance"
bkurzius
8
Если вы используете библиотеку Appcompat, замените Holo на AppCompat. Это работает
ша
3
@LOG_TAG Использование Widget.AppCompat.Light.ActionBar
ша
97

Я нашел способ, который хорошо работает с любой разновидностьюActionBar ( Sherlock , Compat и Native ):

Просто используйте HTML, чтобы установить заголовок и указать цвет текста. Например, чтобы установить красный цвет текста ActionBar , просто сделайте это:

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

Вы также можете использовать красный шестнадцатеричный код #FF0000вместо слова red. Если у вас возникли проблемы с этим, см. Android Html.fromHtml (String) не работает для <font color = '#'> текста </ font> .


Кроме того, если вы хотите использовать цветовой ресурс, этот код можно использовать для получения правильной строки HEX и удаления альфы, если необходимо ( тег шрифта не поддерживает альфа):

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))));
Фил
источник
Это дает ошибку, потому что вы должны поместить строку в метод Html.fromHtml (), и вы помещаете в метод несколько параметров. При замене «,» на «+» это работает отлично :-).
pinyin_samu
3
После десятилетий поиска это самое простое решение! Прекрасная работа!
bmkay
2
@MSI, вы также можете использовать шестнадцатеричные значения, просто замените redна " + color + ".
Фил
1
@MSI, вы можете попробовать то, что предлагает этот пост (также обновил мой вопрос)? Просто замените #FF0000на "+color+".
Фил
1
Спасибо, Фил. Работает отлично! Я пытался таким образом: getSupportActionBar (). SetTitle (Html.fromHtml ("<font color = '" + color + "'>" + "Home" + "</ font>")); Просто должен использовать «вместо \.
MSIslam
93

У меня была та же проблема, что и у вас, это тема Holo.Light, но я хотел стилизовать цвет ActionBar, поэтому мне нужно было также изменить цвет текста, а также заголовок и меню. Итак, в конце я пошел в git hub и просматривал исходный код, пока не нашел чертовски правильный стиль:

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

так что теперь все , что вам нужно сделать , это установить любого @color/actionBarTextи @drawable/actionbarbgroundвы хотите!

Budius
источник
Где я должен использовать этот XML? значения или значения-v11 или значения v-14 ??
DroidLearner
ответ от февраля 2012 года, на тот момент не было V14. Так что V11 точно.
Будий
ниже 3.0 система не имеет actionBar.
Будий
Я использую Action Bar Sherlock, и я нашел решение. Спасибо :)
DroidLearner
3
для шерлока на панели действий вы должны использовать конкретные имена на панели действий и использовать этот генератор: jgilfelt.github.com/android-actionbarstylegenerator Мы всегда используем его там, где я работаю. Это очень хорошо
Будиус
67

Идентификатор ActionBar не доступен напрямую, поэтому вам придется немного взломать здесь.

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
NullPointerExceptionна этой линииactionBarTextView.setTextColor(Color.RED);
DroidLearner
3
Если вы используете API уровня <11, ActionBarSherlock и хотите сэкономить на дорогостоящем вызове getIndentifier(), (TextView) findViewById(com.actionbarsherlock.R.id.abs__action_bar_title);сначала обратитесь к нему (убедитесь, что он не нулевой).
Андре
«Идентификатор ActionBar не доступен напрямую», на самом деле в моем случае панель инструментов легко доступна, например, Toolbar toolbar = findViewById(R.id.toolbar);где в файле макета xml она окружена com.google.android.material.appbar.AppBarLayoutэлементом, затемtoolbar.setTitleTextColor( getResources().getColor( R.color.colorViolet ) );
YoussefDir
32

Это старая тема, но для будущих читателей с помощью панели инструментов все очень просто:

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
toolbar.setTitle(R.string.app_name);
toolbar.setTitleTextColor(getResources().getColor(R.color.someColor));
setSupportActionBar(toolbar);
Масуд Дадаши
источник
28

я сделал простой однострочный код

actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>"));
MilapTank
источник
Разве это не дублирует ответ, приведенный выше: stackoverflow.com/a/19592911/1992342
mike47
Похоже на патч.
Бертрам Гилфойл,
28

Добавьте его в корень панели действий. У меня была эта проблема.

<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 - изменяет цвет текста для текста панели действий, он никогда не работал, когда он был частью Widget.Styled.ActionBar, поэтому мне пришлось добавить его в корень. Другие 2 атрибута изменяют заголовок и подзаголовок панели действий.

Nabdreas
источник
Используйте «android: actionMenuTextColor» вместо «actionMenuTextColor». :)
AnkitRox
20

Установка строки HTML на панели действий не работает для темы Материал в SDK v21 +

Если вы хотите изменить его, вы должны установить основной цвет текста в вашем 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
Это изменяет основной цвет текста везде в приложении!
Мохаммед
16

Самый простой способ сделать это в файле styles.xml.

Шаблон Google styles.xml в настоящее время генерирует следующее:

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

Если вы добавите еще одну строку перед закрывающим тегом, как показано, это изменит цвет текста на тот, который должен быть с темной панелью действий:

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

Если вы хотите настроить цвет на что-то другое, вы можете указать свой собственный цвет в colors.xml или даже использовать встроенный цвет из Android с помощью атрибута 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>

Примечание. При этом изменяется цвет заголовка, а также заголовков любых элементов меню, отображаемых в панели действий.

Сэм
источник
12

Если вы хотите также стилизовать субтитры, просто добавьте их в свой собственный стиль.

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

Люди, которые хотят получить тот же результат для AppCompatбиблиотеки, вот что я использовал:

<?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
источник
Я пробую светлую тему, темную панель действий и белый текст. Ваш код - единственная вещь, которую я нашел до сих пор, которая имеет какой-либо эффект, но она делает всю панель действий белой. Есть идеи, что может происходить? Да, я знаю, что это полтора года. :-)
Нащ
Это помогло мне решить мою проблему. Мне просто нужно было добавить и то <item name="android:titleTextStyle"> и другое, и<item name="titleTextStyle"> потому что я использовал библиотеку поддержки appcompat.
Рок Ли
название
исчезнет
9

Нашел способ сделать это красиво, не создавая свой собственный макет на API> = 21.

Он будет только раскрашивать тексты и управлять рисованием внутри панели действий.

Надеюсь, это будет кому-то полезно.

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

Многие ответы устарели, поэтому я обновлю тему и покажу, как изменить цвет текста и цвет фона на панели инструментов (панели инструментов) и во всплывающем меню панели действий.

Последний подход в Android (по состоянию на май 2018 г.) при работе с панелью действий (панель инструментов) - использовать тему с NoActionBar и использовать вместо нее панель инструментов.

так вот что вам нужно:

  1. В Activity (которая расширяет AppCompatActivity) объявляют панель инструментов:

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);
  2. Добавьте панель инструментов в макет действия xml. Здесь мы установим наши пользовательские (перезаписанные темы), заметки, android:theme="@style/ThemeOverlay.AppTheme.ActionBar"и app:popupTheme="@style/ThemeOverlay.AppTheme.PopupMenu"они сделают свое дело.

    <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. В вашем файле styles.xml вам придется перезаписать эти два стиля для установки пользовательских цветов:

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

Вот и все, ребята

PS, если вы спросите меня, я бы сказал: ДА, вся эта тема - адский беспорядок.

Кирилл Кармазин
источник
5

Это решение я использовал после проверки всех ответов

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

Измените нужные цвета, это будет работать

смаран
источник
4

Эта функция работает хорошо

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

}

затем использовать его просто накормить его свой бар действия и новый цвет, т.е.

ActionBar actionBar = getActionBar();    // Or getSupportActionBar() if using appCompat
int red = Color.RED
setActionbarTextColor(actionBar, red);
365SplendidSuns
источник
4

Попробуйте добавить это в onCreate вашей деятельности. Работает практически на каждой версии Android.

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

или

getSupportActionBar().setTitle(Html.fromHtml("<font color='#ffff00'>Your Title</font>"));
onexf
источник
Вы должны поместить строку, подобную этой: String ColoredTitle = "<font color = '# FFFFFF'>" + Your_Title + "</ font>"; Html.fromHtml (coloredTitle);
Tincho825
2

Попробуйте много методов, в младшей версии API возможный метод, <item name="actionMenuTextColor">@color/your_color</item>а не использование пространства имен Android, надеюсь, может помочь вам

пс:

  <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
источник
1

просто поместите это в своем стиле.

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

Али Кеб
источник
0

Хорошим решением является использование SpannableStringBuilder и установка цвета таким образом. Вы даже можете использовать разные цвета на разных частях строки, добавлять изображения и т. Д.

Протестировано с новой библиотекой поддержки.

См. Android: раскраска части строки с использованием TextView.setText ()?

Maciej Swic
источник
0

Это не рекомендуемое решение, так как я собираюсь использовать Android Apis здесь, но мое приложение требует динмического изменения темы в условиях xml, что здесь невозможно, поэтому мне нужно это сделать. Но это решение работает очень хорошо.

Решение:--

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

Для Android 5 (леденец на палочке) вам придется использовать android: actionBarPopupTheme, чтобы установить textColor для меню переполнения.

m02ph3u5
источник
0

Самый простой способ:
добавьте эти две строки в ваш файл 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>

Замените цвет своим цветом.

Али Наджафи
источник
-1

Вы можете изменить цвет любого текста, используя атрибут html<font> непосредственно в xmlфайлах. например в 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>

введите описание изображения здесь

Hofs
источник