Цвет текста ActionBar

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


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

28 ответов

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

Вот мой файл 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>

Я нашел способ, который хорошо работает с любым вкусом ActionBar (Шерлок, Компат и Родной):

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

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

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


Кроме того, если вы хотите использовать цветовой ресурс, этот код можно использовать для получения правильной строки 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))));

У меня была та же проблема, что и у вас, это тема 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 ты хочешь!

Идентификатор 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);
    }
}

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

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

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

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

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

<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 атрибута изменяют заголовок и подзаголовок панели действий.

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

actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>"));

Установка строки 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>    

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

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

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

Последний подход в 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 если бы вы спросили меня, я бы сказал: ДА, вся эта тема - адский беспорядок.

Нашел способ сделать это красиво, не создавая свой собственный макет на 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>

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

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

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

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

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

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

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

или же

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

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

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

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

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

Попробуйте много методов, в нижней версии 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>

Здесь Style.xml похож на

 <resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- 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/MyTheme</item>
</style>


 <style name="MyTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/AppTheme.ActionBarStyle</item>
</style>

<style name="AppTheme.ActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:titleTextStyle">@style/AppTheme.ActionBar.TitleTextStyle</item>
</style>

<style name="AppTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textColor">@color/colorBlack</item>
</style>

Вы должны добавить

<item name="actionBarTheme">@style/MyTheme</item> 

в AppTheme

В моем случае я переключился на панель инструментов AndroidX вместо использования встроенной панели действий. Кроме того, я полагаюсь на привязку представления для доступа к панели инструментов из действия, но вы можете использовать findViewById(...) для этого.

(Я удалил ненужный код).

styles.xml:

      ...
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
  ...
</style>
...

activity_main.xml:

      ...
<androidx.appcompat.widget.Toolbar
  android:id="@+id/toolbarMain"
  android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
  app:titleTextColor="@color/colorOnPrimary"
  ...
/>
...

MainActivity.kt:

      class MainActivity : AppCompatActivity() {

  private lateinit var binding: ActivityMainBinding
  ...

  override fun onCreate(savedInstanceState: Bundle?) {
    ...
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    setSupportActionBar(binding.toolbarMain)
    ...
  }

  ...
}

Это не рекомендуемое решение, так как я собираюсь использовать 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();
    }

}
<android.support.v7.widget.Toolbar
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:id="@+id/toolbar"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@color/color_primary"
  android:theme="@style/GalaxyZooThemeToolbarDarkOverflow"
  app:popupTheme="@style/Theme.AppCompat.NoActionBar" />


<style name="GalaxyZooThemeToolbarDarkOverflow" parent="Theme.AppCompat.NoActionBar">
  <!-- android:textColorPrimary is the  color of the title text
       in the Toolbar, in the Theme.AppCompat theme:  -->
  <item name="android:textColorPrimary">@color/abc_primary_text_material_light</item>
 
  <!-- android:textColorPrimaryInverse is the  color of the title
       text in the Toolbar, in the Theme.AppCompat.Light theme:  -->
  <!-- <item name="android:textColorPrimaryInverse">@color/abc_primary_text_material_light</item> -->
 
  <!-- android:actionMenuTextColor is the color of the text of
        action (menu) items in the Toolbar, at least in the
        Theme.AppCompat theme.
        For some reason, they already get the textColorPrimary
        when running on API 21, but not on older versions of
        Android, so this is only necessary to support older
        Android versions.-->
        <item name="actionMenuTextColor">@color/abc_primary_text_material_light</item>
  <!-- android:textColorSecondary is the color of the menu
       overflow icon (three vertical dots) -->
  <item name="android:textColorSecondary">@color/abc_secondary_text_material_light</item>
 
  <!-- This would set the toolbar's background color,
        but setting this also changes the popup menu's background,
        even if we define popupTheme for our <Toolbar> -->
  <!-- <item name="android:background">@color/color_primary</item> -->
</style>


**Reference:**
[https://www.murrayc.com/permalink/2014/10/28/android-changing-the-toolbars-text-color-and-overflow-icon-color/][1]

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

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

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

Если вам нужно установить цвет программно, вот способ сделать это:

      static void setActionBarTextColor(Activity activity, int color)
{
      ActionBar actionBar = activity instanceof AppCompatActivity
                    ? ((AppCompatActivity) activity).getSupportActionBar()
                    : activity.getActionBar();
      String title = activity.getTitle(); // or any title you want
      SpannableString ss = new SpannableString(title);
      ss.setSpan(new ForegroundColorSpan(color), 0, title.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
      actionBar.setTitle(ss);
}

Нам нужно определить тему на нашей панели инструментов с атрибутом app:theme, как в приведенном ниже фрагменте кода.

      <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:theme="@style/AppTheme.ToolbarFont" />

Перед этим мы должны добавить тему в наш файл styles.xml и определить семейство шрифтов в этом стиле, как в приведенном ниже фрагменте кода.

      <style name="AppTheme.ToolbarFont" parent="AppTheme">
<!--This line changes the color of text in Toolbar-->
<item name="android:textColorPrimary">@color/black</item>
<!--This line changes the color of icons in toolbar (back, overflow menu icons)-->
<item name="android:textColorSecondary">@color/azul</item>
<item name="textAllCaps">false</item>
<item name="android:textSize">16sp</item>
<item name="android:fontFamily">@font/montserrat_semi_bold</item>

Чтобы добавить пользовательские шрифты, нам нужно создать папку с именем «font» в каталоге res, как показано на снимке экрана ниже.

Мы добились пользовательского шрифта на нашей панели инструментов.

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

      app:titleTextColor="@color/...."
app:subtitleTextColor="@color/...." 
или таким методом:
      setTitleTextColor()

для получения дополнительных свойств проверьте эту ссылку

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

Вы можете изменить цвет любого текста, используя 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>

Другие вопросы по тегам