如何在Android 4.2中更改Action Bar的选项菜单的背景颜色?

我想改变Android 4.2中的选项(溢出)菜单的背景颜色。 我已经尝试了所有的方法,但它仍然显示由主题设置的默认颜色。 我使用了下面的代码和XMLconfiguration。

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不起作用:

菜单示例

在上面的图片中, 我想在操作栏中将菜单背景从黑色更改为蓝色 。 我怎么能做到这一点,我做了什么错了?

有一个简单的方法来更改操作栏中的颜色使用ActionBar生成器和复制粘贴res文件夹中的所有文件,并在Android.manifest文件中更改您的主题。

由Sunnybuild议的Action Bar Style Generator非常有用,但是它会生成大量的文件,如果您只想更改背景颜色,那么大部分文件都是不相关的。

所以,我深入挖掘它生成的zip,并试图缩小哪些部分是重要的,所以我可以对我的应用程序进行最less量的更改。 以下是我发现的。


在样式生成器中,相关设置为popup式颜色 ,这会影响“ 溢出菜单 ,子菜单和微调控制面板背景”。

在这里输入图像描述

继续生成压缩文件,但在生成的所有文件中,只需要一个图像menu_dropdown_panel_example.9.png ,它看起来像这样:

在这里输入图像描述

因此,将其不同的分辨率版本添加到res/drawable-* 。 (也许把它们重命名为menu_dropdown_panel.9.png 。)

然后,作为一个例子,在res/values/themes.xml你可以使用android:popupMenuStyleandroid: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 (Holo Dark),则需要额外的步骤来解答这个问题 !

另外,如果你(像我)想要整个动作栏的风格,而不仅仅是菜单,像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:width="2dp" android:color="#FF000000" /> <solid android:color="#FF2070B0" /> </shape> </item> <item android:bottom="2dp"> <shape android:shape="rectangle"> <stroke android:width="2dp" android:color="#FF2070B0" /> <solid android:color="#00000000" /> <padding android:bottom="2dp" /> </shape> </item> </layer-list> 

至less在Android 4.0+(API级别14+)上工作良好。

如果人们仍在访问一个工作的解决scheme,这是什么为我工作: – 这是为Appcompat支持库。 这是在这里解释的 ActionBar样式的延续

以下是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背景颜色是skyblue和MenuItem文本颜色是粉红色的文本大小为25sp: –

在这里输入图像描述

如果你读到这个,可能是因为以前的所有答案都不适用于你的Holo Dark主题。

Holo Dark为PopupMenus使用了一个额外的包装,所以在做了Jonikbuild议的之后,你必须将下面的样式添加到你的'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> 

而已!

我简单的诀窍来改变popup菜单/选项菜单中的文本的背景颜色和颜色

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

您可以按照以下方式在溢出MenuItem中应用样式和主题。 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> 

我能够通过将hex值放在以下位置来更改溢出行为的颜色:

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

试试这个代码。 将此片段添加到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中添加下面的应用程序片段

  <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > 

如果你在android studio的最新工具栏工作,那么这里是最小的解决scheme要更改工具栏选项菜单的颜色,将其添加到您的工具栏元素

  app:popupTheme="@style/MyDarkToolbarStyle" 

然后在你的styles.xml中定义popup菜单样式

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

请注意,您需要使用colorBackground而不是背景。 后者将应用于所有事物(菜单本身和每个菜单项),前者仅适用于popup式菜单。

我也遇到了同样的问题,最后我得到了简单的解决scheme。 只是添加了一行到行动栏样式。

 <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”足以改变选项菜单的背景

以下是更改操作栏和溢出菜单背景颜色的主题所需的更改。 你需要configurationactionBarStyle&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> 
 <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>