如何使用XML更改ActionBarActivity的ActionBar背景颜色?

302

细节:

我正在扩展ActionBarActivity。
Eclipse和SDK已完全打补丁至2011-11-06。

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14" />  

在安装了Android 2.3.3的三星设备上部署了应用程序,应用程序使用android:theme="@android:style/Theme.Light"

问题:应用程序是亮色的,但ActionBar是蓝色的,带有灰色图标,在蓝色背景色下几乎不可见。我还想让ActionBar变成亮色的,这样灰色图标就更加清晰可见。

我尝试过修改样式,但没有成功。
我可能忽略了一些微不足道的东西。

如何使用XML更改ActionBarActivity的ActionBar的背景颜色?


2
结束这个老话题。根据大家的要求,点赞给Sannidhi,然而对于这个问题的回复涵盖了相当多的Android版本,在我的情况下,David Miller建议使用SherlockActionBar最相关。 - user77115
1
小提示:如果您将XML视图中的第一个元素设置为与ActionBar相同的背景(在我们的情况下是白色),则ActionBar会变成灰色。 - Joshua Pinter
当你思考TitleBar和ActionBar时,它们并没有提供任何特别的东西。它们更像是一个麻烦,特别是当你不了解它们时。一个更好的选择是隐藏它们并设计自己的标题栏。你可以使用视图和可绘制对象添加自己的小部件。因为标题栏不提供小部件,而操作栏只能有一个下拉列表,适用于所有菜单项。甚至很多应用程序已经放弃了操作栏,转而使用自己的设计。 - user9599745
21个回答

539
根据文档,"您可以使用ActionBar API控制操作栏的行为和可见性,这些API在Android 3.0(API级别11)中添加。"
因此,ActionBar不适用于您的目标环境,该环境位于API级别10(Android 2.3.3)。
如果您的目标最低API级别为11,则可以通过定义自定义样式来更改ActionBar的背景颜色,如下所示:
<resources>
    <style name="MyTheme" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
    </style>

    <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">ANY_HEX_COLOR_CODE</item>
    </style>
</resources>

然后,将"MyTheme"设置为应用程序/活动的主题。


12
请使用 <item name="android:textColor">@color/my_color</item> - lethargicpanda
31
如果您正在使用ActionBarCompat库,应该采用相同的方法。唯一的区别是您需要更改actionBarStyle(没有*android:*前缀)项来定义在Android 3.0之前的设备上操作栏的外观。 - Alex Semeniuk
3
有没有可能不用颜色的HEX码,而是引用"@android:color"甚至在"colors.xml"中定义的自定义颜色?我尝试过但没有成功。 - jmrodrigg
1
我无法使用“<item name="android:textColor">@color/my_color</item>”更改文本操作栏文本颜色。 - Shirish Herwade
2
这个在android:background标签下对我没用,但当我省略了android标签并只使用<item name="background">时,颜色在所有平台上都改变了。 - stevyhacker
显示剩余6条评论

219

试试这个

ActionBar bar = getActionBar();
bar.setBackgroundDrawable(new ColorDrawable("COLOR"));

1
11-06 10:53:16.985: E/AndroidRuntime(16956): java.lang.NoSuchMethodError: com.acme.myActivity.getActionBar - user77115
1
@coder_For_Life22,你知道我怎么才能获得一个上下文操作栏吗? - Geeks On Hugs
6
据我所知,支持库本身没有ActionBar,因此您需要包含SherlockActionBar。 - David Miler
23
也许这很奇怪,但在我的情况下,bar.setBackgroundDrawable(new ColorDrawable(Color.BLUE)); 将操作栏颜色更改为灰色。即使使用其他颜色,如 Color.REDColor.GREEN 等,也会发生这种情况……有人遇到过相同的问题,或知道这个问题的原因吗?我使用的是 Nexus S 设备。 - AlexAndro
5
这篇帖子似乎解决了操作栏变灰色的问题。 - Jonathon Fry
显示剩余4条评论

127

试试这个:

ActionBar bar = getActionBar();
bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#0000ff")));

1
这段代码应该放在哪里?我只是好奇它如何与其他代码配合。 - JGallardo
7
我和 @JGallardo 的问题完全相同。您应该在哪里添加这个代码?我试过在 onCreate 中添加,但是出现了一个 NullPointerException 错误。编辑:这是我添加到 restoreActionBar 中的代码:ActionBar actionBar = getSupportActionBar(); actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#E5E4E2"))); - rrrocky
将其添加到您的 Activity 的 onCreate 方法中。 - Ojonugwa Jude Ochalifu
4
请使用 getSupportActionBar() 而不是 getActionBar()。 - Chanaka Fernando

69

使用这个工具 - http://jgilfelt.github.io/android-actionbarstylegenerator/

这是一个神奇的工具,它可以让你实时预览自定义操作栏。

我之前尝试过早期的答案,但总是遇到了像选项卡和字母等其他颜色更改的问题,并花费数小时调整。这个工具帮助我在几分钟内完成了我的设计。

这是该工具的截图

祝你一切顺利! :)


当文件添加到我的应用程序中后,我该如何设置我的应用程序以使用这些文件? - Mike
在上面的截图(名为example)的情况下,粘贴生成的res文件夹后,您应该有一个新的样式@style/Theme.Example。在AndroidManifest.xml中,设置<application android:theme="@style/Theme.example">。应该可以工作 :) - Mohammad Shabaz Moosa
2
弃用。不幸的是。 - Liangjun

58

我曾经遇到过同样的问题,当我输入那段代码时,我的操作栏会变成灰色。很可能你的原始样式表看起来像这样:

<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <!-- API 14 theme customizations can go here. -->
</style>

"DarkActionBar" 是导致你的操作栏变灰的原因。我将其更改为以下内容,然后它就起作用了:

<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
    <!-- API 14 theme customizations can go here. -->
    <item name="android:actionBarStyle">@style/MyActionBar</item>
</style>

<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:background">#2aa4cd</item>
    <item name="android:titleTextStyle">@style/Theme.MyAppTheme.ActionBar.TitleTextStyle</item>
</style>        

<style name="Theme.MyAppTheme.ActionBar.TitleTextStyle" parent="android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textColor">#FFFFFF</item>
</style>    

我还加入了如何编辑文本颜色的内容。同时,不需要改变任何与资源相关的内容。

-沃伦


39

在API < 11中也可以更改操作栏的行为

请参阅Android官方文档了解详情。

我正在使用minSdkVersion = "9"targetSdkVersion = "21"构建一个应用程序,我已经更改了操作栏的颜色,在API级别9中运行良好

以下是一个xml文件

res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- the theme applied to the application or activity -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBar</item>

        <!-- Support library compatibility -->
        <item name="actionBarStyle">@style/MyActionBar</item>
    </style>

    <!-- ActionBar styles -->
    <style name="MyActionBar"
           parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@color/actionbar_background</item>

        <!-- Support library compatibility -->
        <item name="background">@color/actionbar_background</item>
    </style>
</resources>

并设置您想要的操作栏颜色

res/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="actionbar_background">#fff</color> //write the color you want here
</resources>

.class文件中也可以定义Actionbar的颜色,代码片段如下:

ActionBar bar = getActionBar();
bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#0000ff")));

但是这并不能用于API < 11,因此在API < 11中只有通过在xml中为actionbar设置样式的方法。


你能帮忙解决http://stackoverflow.com/questions/28609110/custom-theme-not-applying的问题吗? - Sasha
当在一个 fragment 中使用时,这段代码片段在我的应用中不能工作。我将其改为 ActionBar bar = getActivity().getActionBar(); 。但是一旦 fragment 准备打开,应用就会崩溃。 - Jose Manuel Abarca Rodríguez
1
找到问题了,它可以使用:ActionBar actionBar = getSupportActionBar(); - Jose Manuel Abarca Rodríguez

22
对于Kotlin用户 - 我尝试了一下,这适用于浅色和深色模式 -
    getSupportActionBar()?.setBackgroundDrawable(
             ColorDrawable(Color.parseColor("#003459"))
        
)

把这个代码放在 onCreate 方法中,像这样 -
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        getSupportActionBar()?.setBackgroundDrawable(
             ColorDrawable(Color.parseColor("#003459"))
        )

2
最好使用资源来获取颜色,而不是将其作为文本。 getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(android.R.color.black))); - Dinesh

16

在Nexus 4上,这似乎会使颜色变灰。

ActionBar bar = getActionBar(); // or MainActivity.getInstance().getActionBar()
bar.setBackgroundDrawable(new ColorDrawable(0xff00DDED));
bar.setDisplayShowTitleEnabled(false);  // required to force redraw, without, gray color
bar.setDisplayShowTitleEnabled(true);

(所有的荣誉归原作者,但它被淹没在评论中,所以我想在这里重新展现出来) https://dev59.com/rmQn5IYBdhLWcg3wIkIF#17198657


2
经过数小时的尝试仍搞不清楚问题出在哪里,这个答案帮了我大忙。 - Abdullah Umer

14

尝试一行代码:

getActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.MainColor)));

1
我的应用程序在这个答案中崩溃了。为了使它在片段中工作,我将其更改为:getActivity().getActionBar().setBackgroundDrawable(new ColorDrawable(getActivity().getResources().getColor(R.color.col_nar))); ,还尝试了getActivity().getActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.col_nar))); 。它在片段打开时立即崩溃。 - Jose Manuel Abarca Rodríguez
1
找到问题了,它与以下代码一起使用:ActionBar actionBar = getSupportActionBar(); - Jose Manuel Abarca Rodríguez
1
答案是针对这个活动的。如果你想在片段中使用它,那么你必须使用getActivity().getActionBar()来获取片段的操作栏。 - SANAT

9

2021年:Kotlin一句话代码无过时警告:

supportActionBar?.setBackgroundDrawable(ColorDrawable(ContextCompat.getColor(this,R.color.red)))

简单地将它放入 onCreate 中,并根据您的需要更改颜色。


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