Колір тексту ActionBar


288

як я можу змінити колір тексту в панелі ActionBar? Я успадкував тему Holo Light, я можу змінити фон ActionBar, але не знаю, який атрибут слід змінити, щоб змінити колір тексту.


Гаразд, я можу змінити колір тексту за допомогою атрибута android: textColorPrimary, але він також змінює колір тексту у спадному меню, що відображається, коли переповнення відбувається на кнопках ActionBar. Будь-яка ідея, як змінити колір випадаючого меню / списку?


щойно опублікував рішення, яке працювало на мене. дивіться тут stackoverflow.com/a/16175220/627827
spaceMonkey

Відповіді:


447

Гаразд, я знайшов кращий спосіб. Зараз я можу лише змінити колір заголовка. Ви також можете налаштувати підзаголовки.

Ось мій стиль.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>

32
Це правильний шлях. Однак для послідовності вам слід успадковувати Widget.Holo.Light.ActionBarза MyTheme.ActionBarStyle.
Джейк Уортон

7
Не будується - ADT скаржиться, що для нього потрібен v13 або вище (тому ... не працюватиме на більшості телефонів 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
sha

97

Я знайшов спосіб, який добре працює з будь-яким ароматом ActionBar( Шерлок , Компат та Рідний ):

Просто використовуйте 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ви хочете!


Де мені потрібно використовувати цей xml? значення або значення-v11 або значення v-14 ??
DroidLearner

відповідь від feb / 2012, на той час не було V14. Тож V11 точно.
Будій

нижче 3.0 система не має бар дій.
Будій

Я використовую програму Action 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 = (Toolbar) findViewById(R.id.tool_bar);
toolbar.setTitle(R.string.app_name);
toolbar.setTitleTextColor(getResources().getColor(R.color.someColor));
setSupportActionBar(toolbar);


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


Використовуйте "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.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>

Якщо ви додасте ще один рядок перед закриваючим тегом, як показано, це змінить колір тексту таким, яким він має бути в 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>

Якщо ви хочете налаштувати колір на щось інше, ви можете або вказати свій власний колір у кольорах.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>

Примітка. Це змінює колір заголовка, а також заголовки будь-яких меню MenuTtems, що відображаються в панелі дій.


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>

Я намагаюся отримати світлу тему, темну смугу дій та білий текст. Ваш код - це єдине, що я знайшов поки що, який має будь-який ефект, але він перетворює всю панель дій білою. Будь-яка ідея, що може статися? Так, я знаю, що це півтора року. :-)
nasch

Це допомогло мені вирішити свою проблему. Мені просто потрібно було додати і те, <item name="android:titleTextStyle"> і <item name="titleTextStyle"> тому, що я використовував бібліотеку підтримки appcompat.
Рок Лі

заголовок не зникає
jairhumberдо

8

Знайшов спосіб зробити це красиво, не створюючи власний макет в 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

Дуже багато відповідей застаріло, тому я оновлюю потік і покажу, як змінити колір тексту та кольори тла на ActionBar (Панелі інструментів) та у спливаючому меню ActionBar.

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

тож ось що вам потрібно:

  1. У розділі Діяльність (який розширює 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);

4

Спробуйте додати це до своєї діяльності onCreate. Працює майже в кожній версії Android.

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

або

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

Ви повинні поставити такий рядок: String colorTitle = "<font color = '# FFFFFF'>" + Your_Title + "</font>"; Html.fromHtml (кольоровий титл);
Tincho825

2

Спробуйте багато методів, в низькій версії API можливий метод - <item name="actionMenuTextColor">@color/your_color</item>і не використовуйте простір імен Android, сподіваюся, можуть допомогти вам

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>

1

просто поставте це у своєму стилі Thme.

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


0

Приємним рішенням є використання SpannableStringBuilder і встановлення кольору таким чином. Ви навіть можете використовувати різні кольори на різних частинах струни, додавати зображення тощо.

Тестовано з новою бібліотекою підтримки.

Див. Android: Розфарбування частини рядка за допомогою TextView.setText ()?


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 для меню переповнення.


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>

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.