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


70

我想在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无效:

菜单样本

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


请参考下面这个链接 stackoverflow.com/questions/27787890/...
帕Pyati

Answers:


18

有一种简单的方法可以在Actionbar中更改颜色。使用ActionBar Generator并将所有文件复制粘贴到文件res夹中,并在Android.manifest文件中更改主题。


1
+1,我发现使之起作用的唯一方法确实是样式生成器。如果您不想将它创建的所有数十个文件都添加到项目中,请查看this
Jonik

4
即使解决了问题,这也没有回答如何正确执行的问题
Nlinscott

94

如果人们仍然在寻找可行的解决方案,这对我有用:-这是针对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背景色为天蓝色,MenuItem文本颜色为粉红色,文本大小为25sp:-

在此处输入图片说明


1
谢谢@Nicks,android:itemBackground对我有用而android:popupBackground不是我有用。
Ninja

1
是的,应用程序兼容性充满了琐碎的琐事,如果不是这个网站,我将永远不会明白。
user798719 2015年

2
感谢您阻止我发疯(AppCompat很烂)
SoliQuiD

1
感谢您的帮助android:itemBackground,它使用appcompat 23.1.1在Android M上为我实现了成功。没有其他解决方案。
JHH

3
这消除了涟漪效应:(
David Velasquez

89

操作栏式发电机由阳光建议,是非常有用的,但它产生了很多文件,如果你只是想改变背景颜色大部分是不相关的。

因此,我更深入地研究了它生成的zip,并尝试缩小了重要的部分,以便对应用程序进行最少的更改。以下是我发现的内容。


在样式生成器中,相关设置是Popup color,它会影响“溢出菜单,子菜单和微调面板背景”。

在此处输入图片说明

继续并生成zip,但是在生成的所有文件中,您实际上只需要一个图像,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>

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


谢谢乔尼克。这对我来说可以通过android:popupMenuStyle和android:popupBackground更改Popup背景颜色。您能指导我在弹出菜单中更改文本颜色吗?
VikramV 2014年

2
@VikramV:我设法使用android:itemTextAppearance&更改了菜单文本的颜色,android:textColor 如本答案所述
Jonik

10
由于某些奇怪的原因,这在android 4.4上不适合我。完全相同的设置...
2014年

@artworkadシ,很好奇;对我来说可以在4.4上正常工作。您正在使用什么基本主题?如果是Holo Dark,可以尝试这样做
Jonik

2
GG的答案,对我很有帮助。不幸的是,我使用的是android:Theme.Holo.Light.DarkActionBar并且弹出窗口不会更改。看来这是一个错误:-/。
JJ86 2014年

17

如果您阅读此书,则可能是因为以前的所有答案均不适用于您基于Holo Dark的主题。

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>

而已!


哦,可惜,这是一个非常彻底的解释:(
rupps

真的不存在扭曲较少的方法吗?...目前,API28仍然没有其他系统可以用一种不太疯狂的方式来定义操作栏的颜色?
布朗茨

嗯,答案是4岁!现在已不建议使用ActionBar,可以使用ToolBar设置所需的任何颜色。唯一的事情是弹出菜单的背景,我不知道情况是否有所改善,反正只是一种风格,不是那么扭曲吗?
rupps

15

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

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

请注意,您需要使用colorBackground而不是背景。后者将应用于所有内容(菜单本身和每个菜单项),前者仅应用于弹出菜单。


4

我也遇到了同样的问题,最后我得到了简单的解决方案。刚刚在动作栏样式中添加了一行。

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


4

快速的方式!

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
tmm1

4

在您的应用主题内,您可以设置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>,否则将不会更改子菜单标题。
尤金·卡尔托耶夫

3

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

2

我可以通过将十六进制值放在以下位置来更改操作溢出的颜色:

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

2

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

1

试试这个代码。将此片段添加到您的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"  >

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

0

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

0

我用了它,而且效果很好。

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

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

0

仅要更改应用栏的颜色,如果您还想更改电池栏的颜色,只需更改colors.xml文件和colorPrimaryDark中的colorPrimary值即可:

<resources>
  <color name="colorPrimary">#B90C0C</color>
  <color name="colorPrimaryDark">#B90C0C</color>
  <color name="colorAccent">#D81B60</color>
</resources>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.