操作栏文字颜色

313

如何更改ActionBar的文本颜色?我继承了Holo Light主题,能够更改ActionBar的背景,但找不到可调整的属性来更改文本颜色。


好的,我可以使用android:textColorPrimary属性更改文本颜色,但这也会更改在ActionBar按钮上溢出时显示的下拉菜单的文本颜色。有什么办法可以更改那些下拉菜单/列表的颜色吗?


我刚刚发布了一个对我有效的解决方案。请查看这里https://dev59.com/c2025IYBdhLWcg3wVkYR#16175220 - spaceMonkey
28个回答

459

好了,我找到了更好的方法。现在我只能改变标题的颜色。您也可以调整副标题。

这是我的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>

34
这是正确的方法。然而,为了保持一致性,你应该让MyTheme.ActionBarStyle继承自Widget.Holo.Light.ActionBar - Jake Wharton
7
无法建立 - ADT 抱怨它需要 v13 或更高版本(所以...在大多数 Android 手机上无法工作 :( ) - Adam
8
@Adam,我遇到了同样的问题,但是下一个答案对我有效——用 parent="@android:style/TextAppearance" 替换 parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title"。 - bkurzius
9
如果您正在使用Appcompat库,请用AppCompat取代Holo。这样做可以正常运行。 - sha
5
@sha,正确!为了更精确,请使用“@style/TextAppearance.AppCompat.Widget.ActionBar.Title”,而不是“@android:style/TextAppearance.AppCompat.Widget.ActionBar.Title”。 - Mihir Shah
显示剩余7条评论

103

我找到了一种适用于任何 ActionBarSherlockCompatNative)的好方法:

只需要使用 html 来设置标题,并指定文本颜色。例如,要将 ActionBar 文本颜色设置为红色,只需执行以下操作:

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

您还可以使用红色十六进制代码#FF0000代替单词red。如果您在使用中遇到问题,请参阅Android Html.fromHtml(String) doesn't work for <font color='#'>text</font>
此外,如果您想使用颜色资源,可以使用此代码获取正确的HEX字符串,并根据需要删除alpha(font标签不支持alpha):
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 + " - Phil
1
@MSI,你可以尝试一下这篇帖子中的建议(我也更新了我的问题)吗?只需将#FF0000替换为"+color+"即可。 - Phil
1
谢谢Phil。它完美地工作了!我是这样尝试的:getSupportActionBar().setTitle(Html.fromHtml("<font color='"+color+"'>"+"Home"+"</font>")); 只需使用'代替\即可。 - MSIslam
显示剩余10条评论

95

我和你遇到了同样的问题,这是一个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?values还是values-v11或者values-v14? - DroidLearner
答案是从2012年2月得出的,当时还没有V14,所以肯定是V11。 - Budius
低于3.0版本的系统没有ActionBar。 - Budius
我正在使用Action Bar Sherlock,我找到了解决方案。谢谢 :) - DroidLearner
3
对于ActionBarSherlock,您需要使用特定的ActionBar名称,并且可以使用此生成器:http://jgilfelt.github.com/android-actionbarstylegenerator/ 我们在我的工作中始终使用它。它非常好。 - Budius
这里只改变了标题颜色,而没有改变菜单选项。 :( - Rodrigo Venancio

68

ActionBar的ID不能直接获取,因此您需要在这里进行一些小的技巧处理。

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

2
在这一行 actionBarTextView.setTextColor(Color.RED); 上出现了 NullPointerException - DroidLearner
3
如果您正在使用API级别<11且使用ActionBarSherlock,并且想要避免昂贵的getIndentifier()调用,则可以首先查找(TextView) findViewById(com.actionbarsherlock.R.id.abs__action_bar_title);(务必检查它不是null)。 - Andre
ActionBar的ID无法直接使用,但在我的情况中,工具栏可以轻松访问,如Toolbar toolbar = findViewById(R.id.toolbar);,其中在XML布局文件中,它被com.google.android.material.appbar.AppBarLayout元素包围,然后使用toolbar.setTitleTextColor(getResources().getColor(R.color.colorViolet)); - YoussefDir

37

最简单的方法是在styles.xml中进行操作。

谷歌的模板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>

注意:这将更改标题的颜色,也会更改在操作栏中显示的任何MenuItem的标题。


36

这个话题很老套,但对于未来的读者来说,使用工具栏会使一切变得非常容易:

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

1
这对我非常有效。您还可以使用:toolbar.setTitleTextColor(Color.parseColor("#ffffff"))。 - alexrnov

29

我已经用简单的一行代码完成了

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

1
这不是与上面给出的答案本质上重复了吗:https://dev59.com/uG025IYBdhLWcg3wr4B6#19592911 - mike47
看起来像是一个补丁。 - Bertram Gilfoyle

29
将其添加到操作栏的根部。我曾经也遇到过这个问题。
<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

19

在SDK v21+中,在Material主题上设置操作栏的HTML字符串无效。

如果您想更改它,应该在您的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>    

5
这会改变应用程序中所有地方的主要文本颜色! - Mohammed

13

如果您想样式化副标题,只需在自定义样式中添加此内容即可。

<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支持库。 - Rock Lee
1
标题消失 - jairhumberto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接