如何在 Android 4.2 中更改操作栏选项菜单的背景颜色?
Posted
技术标签:
【中文标题】如何在 Android 4.2 中更改操作栏选项菜单的背景颜色?【英文标题】:How to change the background color of Action Bar's Option Menu in Android 4.2? 【发布时间】:2013-11-08 16:35:57 【问题描述】:我想更改 android 4.2 中选项(溢出)菜单的背景颜色。我已经尝试了所有方法,但它仍然显示主题设置的默认颜色。我使用了以下代码和 XML 配置。
MainActivity.java
public class MainActivity extends Activity
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setIcon(R.drawable.ic_launcher);
getActionBar().setTitle("Sample Menu");
getActionBar().setBackgroundDrawable(new
ColorDrawable(Color.parseColor("#33B5E5")));
int titleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
TextView titleText = (TextView)findViewById(titleId);
titleText.setTextColor(Color.parseColor("#ffffff"));
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
setMenuBackground();
return true;
protected void setMenuBackground()
// Log.d(TAG, "Enterting setMenuBackGround");
getLayoutInflater().setFactory( new Factory()
@Override
public View onCreateView(String name, Context context,
AttributeSet attrs)
if ( name.equalsIgnoreCase( "com.android.internal.view.menu.IconMenuItemView" ) )
try // Ask our inflater to create the view
LayoutInflater f = getLayoutInflater();
final View view = f.createView( name, null, attrs );
/* The background gets refreshed each time a new item is added the options menu.
* So each time Android applies the default background we need to set our own
* background. This is done using a thread giving the background change as runnable
* object */
new Handler().post( new Runnable()
public void run ()
// sets the background color
view.setBackgroundResource( R.color.menubg);
// sets the text color
((TextView) view).setTextColor(Color.WHITE);
// sets the text size
((TextView) view).setTextSize(18);
);
return view;
catch ( InflateException e )
catch ( ClassNotFoundException e )
return null;
);
Menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:icon="@drawable/menu"
android:showAsAction="always"
android:title="@string/action_settings">
<menu>
<item
android:id="@+id/item1"
android:showAsAction="always"
android:title="@string/item1" />
<item
android:id="@+id/item2"
android:showAsAction="always"
android:title="@string/item2" />
<item
android:id="@+id/item3"
android:showAsAction="always"
android:title="@string/item3" />
<item
android:id="@+id/item4"
android:showAsAction="always"
android:title="@string/item4" />
</menu>
</item>
</menu>
color.xml
<color name="menubg">#33B5E5</color>
上面的 setMenuBackground 没有生效:
在上图中,我想将操作栏中的菜单背景从黑色更改为蓝色。我怎样才能做到这一点,我做错了什么?
【问题讨论】:
参考以下链接***.com/questions/27787890/… 【参考方案1】:如果人们仍在访问一个有效的解决方案,这对我有用:-- 这是 Appcompat 支持库。 这是 ActionBar 样式 explained here
的延续下面是styles.xml文件。
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- This is the styling for action bar -->
<item name="actionBarStyle">@style/MyActionBar</item>
<!--To change the text styling of options menu items</item>-->
<item name="android:itemTextAppearance">@style/MyActionBar.MenuTextStyle</item>
<!--To change the background of options menu-->
<item name="android:itemBackground">@color/skyBlue</item>
</style>
<style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="background">@color/red</item>
<item name="titleTextStyle">@style/MyActionBarTitle</item>
</style>
<style name="MyActionBarTitle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">@color/white</item>
</style>
<style name="MyActionBar.MenuTextStyle"
parent="style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">@color/red</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">25sp</item>
</style>
</resources>
这就是它的外观——MenuItem 背景颜色是天蓝色,MenuItem 文本颜色是粉红色,textsize 为 25sp:--
【讨论】:
谢谢@Nicks,android:itemBackground
为我工作,android:popupBackground
不行。
是的,应用程序兼容性充满了琐事,如果不是这个网站,我永远不会想到。
谢谢你阻止我发疯(AppCompat 很烂)
感谢android:itemBackground
,它在使用 appcompat 23.1.1 的 Android M 上为我解决了问题。没有其他解决方案。
这消除了涟漪效应 :(【参考方案2】:
Action Bar Style Generator、suggested by Sunny 非常有用,但它会生成 很多 文件,如果您只想更改背景颜色,其中大部分是无关紧要的。
因此,我深入研究了它生成的 zip,并尝试缩小重要的部分,以便我可以对我的应用程序进行最少的更改。下面是我发现的。
在样式生成器中,相关设置为Popup color,影响“溢出菜单、子菜单和微调面板背景”。
继续并生成 zip,但在生成的所有文件中,您只需要一张图片,menu_dropdown_panel_example.9.png
,看起来像这样:
所以,将它的不同分辨率版本添加到res/drawable-*
。 (也许将它们重命名为menu_dropdown_panel.9.png
。)
然后,例如,在res/values/themes.xml
中,您将拥有以下内容,其中 android:popupMenuStyle
和 android:popupBackground
是关键设置。
<resources>
<style name="MyAppActionBarTheme" parent="android:Theme.Holo.Light">
<item name="android:popupMenuStyle">@style/MyApp.PopupMenu</item>
<item name="android:actionBarStyle">@style/MyApp.ActionBar</item>
</style>
<!-- The beef: background color for Action Bar overflow menu -->
<style name="MyApp.PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">@drawable/menu_dropdown_panel</item>
</style>
<!-- Bonus: if you want to style whole Action Bar, not just the menu -->
<style name="MyApp.ActionBar" parent="android:Widget.Holo.Light.ActionBar.Solid">
<!-- Blue background color & black bottom border -->
<item name="android:background">@drawable/blue_action_bar_background</item>
</style>
</resources>
当然还有AndroidManifest.xml
:
<application
android:theme="@style/MyAppActionBarTheme"
... >
您通过此设置获得什么:
请注意,我使用 Theme.Holo.Light
作为基本主题。如果您使用 Theme.Holo
(全息黑暗),则需要额外的步骤 this answer describes!
另外,如果你(像我一样)想要设置整个操作栏的样式,而不仅仅是菜单,请在 res/drawable/blue_action_bar_background.xml
中添加类似的内容:
<!-- Bonus: if you want to style whole Action Bar, not just the menu -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle">
<stroke android: android:color="#FF000000" />
<solid android:color="#FF2070B0" />
</shape>
</item>
<item android:bottom="2dp">
<shape android:shape="rectangle">
<stroke android: android:color="#FF2070B0" />
<solid android:color="#00000000" />
<padding android:bottom="2dp" />
</shape>
</item>
</layer-list>
至少在 Android 4.0+(API 级别 14+)上运行良好。
【讨论】:
谢谢乔尼克。这对我来说可以使用 android:popupMenuStyle 和 android:popupBackground 更改 Popup 背景颜色。您能否指导我更改弹出菜单中的文本颜色? @VikramV:我设法使用android:itemTextAppearance
& android:textColor
as described in this answer 更改了菜单文本颜色。
出于某种奇怪的原因,这对我在 android 4.4 上不起作用。完全相同的设置...
@artworkadshi,好奇;对我来说在 4.4 上工作正常。您使用的是什么基本主题?如果 Holo Dark,你可以try if this works。
GG 的答案,它帮助了我很多。不幸的是,我正在使用 android:Theme.Holo.Light.DarkActionBar 并且弹出窗口不会改变。看来这是一个错误:-/ .【参考方案3】:
有一种简单的方法可以更改操作栏中的颜色
使用ActionBar Generator 并将所有文件复制粘贴到您的res
文件夹中,然后在Android.manifest 文件中更改您的主题。
【讨论】:
+1,我发现使它工作的唯一方法确实是样式生成器。如果您不想将它创建的所有几十个文件添加到您的项目中,check out this. 尽管它解决了问题,但这并没有回答如何准确地做到这一点的问题【参考方案4】:如果您阅读本文,可能是因为之前的所有答案都不适用于您基于 Holo Dark 的主题。
Holo Dark 为 PopupMenus 使用了一个额外的包装器,因此在执行what Jonik suggested 之后,您必须将以下样式添加到您的“xml”文件中:
<style name="PopupWrapper" parent="@android:style/Theme.Holo">
<item name="android:popupMenuStyle">@style/YourPopupMenu</item>
</style>
然后在你的主题块中引用它:
<style name="Your.cool.Theme" parent="@android:style/Theme.Holo">
.
.
.
<item name="android:actionBarWidgetTheme">@style/PopupWrapper</item>
</style>
就是这样!
【讨论】:
哦,真可惜,解释得很透彻:( 真的不存在不那么扭曲的方法吗? ... 目前 API28 仍然没有其他系统可以以不那么疯狂的方式定义操作栏的颜色?。 嗯,答案是 4 岁! ActionBar 现在已被弃用,使用 ToolBar 你可以设置任何你想要的颜色。唯一的问题是弹出菜单背景,我不知道这里的情况是否有所改善,反正它只是一种风格,没有那么扭曲吧?【参考方案5】:我在弹出菜单/选项菜单中更改背景颜色和文本颜色的简单技巧
<style name="CustomActionBarTheme"
parent="@android:style/Theme.Holo">
<item name="android:popupMenuStyle">@style/MyPopupMenu</item>
<item name="android:itemTextAppearance">@style/TextAppearance</item>
</style>
<!-- Popup Menu Background Color styles -->
<style name="MyPopupMenu"
parent="@android:style/Widget.Holo.ListPopupWindow">
<item name="android:popupBackground">@color/Your_color_for_background</item>
</style>
<!-- Popup Menu Text Color styles -->
<style name="TextAppearance">
<item name="android:textColor">@color/Your_color_for_text</item>
</style>
【讨论】:
【参考方案6】:如果您在 android studio 的最新工具栏中工作,那么这里是最小的解决方案 要更改工具栏选项菜单颜色,请将其添加到您的工具栏元素
app:popupTheme="@style/MyDarkToolbarStyle"
然后在你的styles.xml中定义弹出菜单样式
<style name="MyDarkToolbarStyle" parent="ThemeOverlay.AppCompat.Light">
<item name="android:colorBackground">@color/mtrl_white_100</item>
<item name="android:textColor">@color/mtrl_light_blue_900</item>
</style>
请注意,您需要使用颜色背景而不是背景。后者适用于所有内容(菜单本身和每个菜单项),前者仅适用于弹出菜单。
【讨论】:
【参考方案7】:在您的应用主题中,您可以设置 android:itemBackground 属性来更改操作菜单的颜色。
例如:
<style name="AppThemeDark" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/drk_colorPrimary</item>
<item name="colorPrimaryDark">@color/drk_colorPrimaryDark</item>
<item name="colorAccent">@color/drk_colorAccent</item>
<item name="actionBarStyle">@style/NoTitle</item>
<item name="windowNoTitle">true</item>
<item name="android:textColor">@color/white</item>
<!-- THIS IS WHERE YOU CHANGE THE COLOR -->
<item name="android:itemBackground">@color/drk_colorPrimary</item>
</style>
【讨论】:
使用<item name="android:colorBackground">@color/colorAppWhite</item>
,否则不会改变子菜单标题。【参考方案8】:
我也遇到了同样的问题,最后我得到了简单的解决方案。只是在操作栏样式中添加了一行。
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:textColorPrimary">@color/colorAccent</item>
<item name="android:colorBackground">@color/colorAppWhite</item>
</style>
"android:colorBackground"足以改变选项菜单背景
【讨论】:
【参考方案9】:快!
styles.xml
<style name="popupTheme" parent="Theme.AppCompat.Light">
<item name="android:background">@color/colorBackground</item>
<item name="android:textColor">@color/colorItem</item>
</style>
然后将此特定样式添加到您的 AppTheme 样式中
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="popupTheme">@style/popupTheme</item>
</style>
完成!
【讨论】:
不要设置android:background
,而是使用android:colorBackground
【参考方案10】:
您可以按以下方式在溢出菜单项中应用样式和主题。 OverFlow Menu 是 ListView 所以,我们可以根据 listview 应用主题。
在styles.xml中应用下面的代码
<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:dropDownListViewStyle">@style/PopupMenuListView</item>
<item name="android:actionBarWidgetTheme">@style/PopupMenuTextView</item>
<item name="android:popupMenuStyle">@style/PopupMenu</item>
<item name="android:listPreferredItemHeightSmall">40dp</item>
</style>
<!-- Change Overflow Menu ListView Divider Property -->
<style name="PopupMenuListView" parent="@android:style/Widget.Holo.ListView.DropDown">
<item name="android:divider">@color/app_navigation_divider</item>
<item name="android:dividerHeight">1sp</item>
<item name="android:listSelector">@drawable/list_selector</item>
</style>
<!-- Change Overflow Menu ListView Text Size and Text Size -->
<style name="PopupMenuTextView" parent="@android:style/Widget.Holo.Light.TextView">
<item name="android:textColor">@color/app_white</item>
<item name="android:textStyle">normal</item>
<item name="android:textSize">18sp</item>
<item name="android:drawablePadding">25dp</item>
<item name="android:drawableRight">@drawable/navigation_arrow_selector</item>
</style>
<!-- Change Overflow Menu Background -->
<style name="PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">@drawable/menu_overflow_bg</item>
</style>
【讨论】:
【参考方案11】:我只需将十六进制值放在以下位置即可更改动作溢出的颜色:
<!-- The beef: background color for Action Bar overflow menu -->
<style name="MyApp.PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">HEX VALUE OF COLOR</item>
</style>
【讨论】:
【参考方案12】:将关注添加到您的Styles.xml
<style name="Custom_Theme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:itemBackground">@color/white</item>
<item name="android:textColor">@color/colorPrimaryDark</item>
</style>
仅在 activity_main.xml
中更改主题。
android:theme="@style/Custom_Theme"
【讨论】:
【参考方案13】:试试这个代码。将此 sn-p 添加到您的 res>values>styles.xml
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:actionBarWidgetTheme">@style/Theme.stylingactionbar.widget</item>
</style>
<style name="PopupMenu" parent="@android:style/Widget.Holo.ListPopupWindow">
<item name="android:popupBackground">@color/DarkSlateBlue</item>
<!-- for @color you have to create a color.xml in res > values -->
</style>
<style name="Theme.stylingactionbar.widget" parent="@android:style/Theme.Holo">
<item name="android:popupMenuStyle">@style/PopupMenu</item>
</style>
并在Manifest.xml中添加应用下的sn-p
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
【讨论】:
【参考方案14】:<style name="customTheme" parent="any_parent_theme">
<item name="android:itemBackground">#424242</item>
<item name="android:itemTextAppearance">@style/TextAppearance</item>
</style>
<style name="TextAppearance">
<item name="android:textColor">#E9E2BF</item>
</style>
【讨论】:
【参考方案15】:以下是更改操作栏和溢出菜单背景颜色所需的主题更改。你需要配置actionBarStyle和popupMenuStyle的“android:background”
<application
android:name="...."
android:theme="@style/AppLightTheme">
<style name="AppLightTheme" parent="android:Theme.Holo.Light">
<item name="android:actionBarStyle">@style/ActionBarLight</item>
<item name="android:popupMenuStyle">@style/ListPopupWindowLight</item>
</style>
<style name="ActionBarLight" parent="android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">@color/white</item>
</style>
<style name="ListPopupWindowLight"parent="@android:style/Widget.Holo.Light.ListPopupWindow">
<item name="android:background">@color/white</item>
</style>
【讨论】:
【参考方案16】:我用过这个,效果很好。
在 onCreate() 函数中应用这段代码
val actionBar: android.support.v7.app.ActionBar? = supportActionBar
actionBar?.setBackgroundDrawable(ColorDrawable(Color.parseColor("Your color code here")))
【讨论】:
【参考方案17】:要仅更改应用栏的颜色,您只需更改 colors.xml 文件中的 colorPrimary 值,如果您还想更改电池栏颜色,则只需更改 colorPrimaryDark:
<resources>
<color name="colorPrimary">#B90C0C</color>
<color name="colorPrimaryDark">#B90C0C</color>
<color name="colorAccent">#D81B60</color>
</resources>
【讨论】:
以上是关于如何在 Android 4.2 中更改操作栏选项菜单的背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Detox 在 Android 上的操作栏中点击三点菜单(更多选项)?
如何更改 SearchView 上的默认图标,以便在 Android 的操作栏中使用?