如何在 Android 4.2中更改动作栏的选项菜单的背景颜色?

我想改变 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>

Xml

<color name="menubg">#33B5E5</color>

上面的 setMenuBack 没有任何效果:

Menu Sample

在上面的图片中,我想改变菜单的背景从黑色到蓝色的行动栏。我怎样才能做到这一点,我做错了什么?

189510 次浏览

在 Actionbar 有一个简单的方法可以改变颜色 使用 动作条生成器并复制粘贴您的 res文件夹中的所有文件,并在 Android.manifest 文件中更改您的主题。

动作条风格生成器 桑尼建议的,是非常有用的,但它生成的 很多的文件,其中大多数是不相关的,如果你只想改变背景颜色。

因此,我深入研究了它生成的压缩文件,并试图缩小哪些部分是重要的,这样我就可以对我的应用程序进行最小量的更改。下面是我的发现。


在样式生成器中,相关设置为 弹出颜色,影响“ 溢出菜单,子菜单和旋转面板背景”。

enter image description here

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

enter image description here

因此,将它的不同分辨率版本添加到 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"
... >

这个设置的结果是:

enter image description here

注意,我使用 Theme.Holo.Light作为基本主题。如果你使用 Theme.Holo(全黑) ,有一个额外的步骤需要作为 这个答案描述了

此外,如果你(像我一样)想要设计整个动作栏,而不仅仅是菜单,在 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>

至少在 Android 4.0 + (API 级别14 +)上运行良好。

我可以通过将十六进制值设置为:

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

下面是更改动作栏和溢出菜单背景颜色所需的主题变化。您需要配置 actionBarStyle 和 popupMenuStyle 的“ android: back”

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

如果你读了这篇文章,可能是因为之前所有的答案都不适合你的基于 你好,黑暗的主题。

Holo Dark 为 PopupMenus 使用了一个额外的包装器,因此在执行 Jonik 的建议之后,您必须将以下样式添加到您的“ 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>

就是这样!

在弹出菜单/选项菜单中更改文本的背景颜色和颜色的简单技巧

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

试试这段代码,将这段代码添加到 res > value > 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 下面

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


android:theme="@style/AppTheme"  >

您可以在 Overflow MenuItem 中应用样式和主题,如下所示。OverFlow 菜单是 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>

如果人们还在访问一个工作的解决方案,这里是什么工作为我: ——这是为 Appcompat 支持库。 这是 ActionBar 样式 < a href = “ https://stackoverflow./a/32324163/1234913”> 的延续

下面是 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 文本颜色是粉红色,文本大小为25sp: ——

enter image description here

我也被同样的问题所困扰,最后我得到了简单的解决方案。只是增加了一行动作栏的风格。

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:textColorPrimary">@color/colorAccent</item>
<item name="android:colorBackground">@color/colorAppWhite</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>

快点!

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>

搞定!

将以下内容添加到 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"

在应用程序主题中,可以设置 android: itemBack 属性来更改操作菜单的颜色。

例如:

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

我用了这个,效果很好。

在 onCreate ()函数中应用此代码

val actionBar: android.support.v7.app.ActionBar? = supportActionBar
actionBar?.setBackgroundDrawable(ColorDrawable(Color.parseColor("Your color code here")))

如果你想改变电池条的颜色,只需要改变 Colors.xml 文件中的 color 质量值和 ColorPrimaryDark 就可以了:

<resources>
<color name="colorPrimary">#B90C0C</color>
<color name="colorPrimaryDark">#B90C0C</color>
<color name="colorAccent">#D81B60</color>
</resources>