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

MKD*_*MKD 66 android android-menu android-theme android-actionbar android-4.2-jelly-bean

我想更改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;
        }});
}

}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

color.xml

<color name="menubg">#33B5E5</color>
Run Code Online (Sandbox Code Playgroud)

上面的setMenuBackground没有任何效果:

菜单示例

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

Jon*_*nik 88

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

因此,我深入研究了它生成的zip,并试图缩小重要的部分,因此我可以对我的应用程序进行最少量的更改.以下是我发现的.


在样式生成器中,相关设置为Popup颜色,这会影响" 溢出菜单,子菜单和微调器面板背景".

在此输入图像描述

继续生成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>
Run Code Online (Sandbox Code Playgroud)

当然,在AndroidManifest.xml:

<application
    android:theme="@style/MyAppActionBarTheme" 
    ... >
Run Code Online (Sandbox Code Playgroud)

这个设置你得到了什么:

在此输入图像描述

请注意,我使用的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>
Run Code Online (Sandbox Code Playgroud)

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

  • 由于一些奇怪的原因,这对我来说不适用于android 4.4.完全相同的设置...... (10认同)
  • @VikramV:我设法使用`android:itemTextAppearance`和`android:textColor` [如本答案中所述](http://stackoverflow.com/a/19212678/56285)更改菜单文本颜色. (2认同)
  • GG的答案,对我帮助很大.不幸的是我正在使用android:Theme.Holo.Light.DarkActionBar和popup不会改变.这似乎是一个错误: - /. (2认同)

Nic*_*cks 85

如果人们仍在访问工作解决方案,这对我有用: - 这适用于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>
Run Code Online (Sandbox Code Playgroud)

这就是它的外观 - MenuItem背景颜色是天蓝色,MenuItem文本颜色是粉红色,文本大小为25sp: -

在此输入图像描述

  • 这消除了涟漪效应:( (3认同)
  • 是的,应用程序兼容性充满了琐事,如果不是这个网站,我永远不会想到。 (2认同)
  • 谢谢你阻止我发疯(AppCompat糟透了) (2认同)

Sun*_*nny 20

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

  • 这并没有回答如何做到这一点的问题,即使它解决了这个问题 (2认同)

rup*_*pps 17

如果您读到这个,可能是因为之前的所有答案都不适合您的Holo Dark主题.

Holo Dark为PopupMenus使用了一个额外的包装器,所以在做了Jonik建议之后你必须在'xml'文件中添加以下样式:

<style name="PopupWrapper" parent="@android:style/Theme.Holo">
    <item name="android:popupMenuStyle">@style/YourPopupMenu</item>
</style>
Run Code Online (Sandbox Code Playgroud)

然后在主题块中引用它:

<style name="Your.cool.Theme" parent="@android:style/Theme.Holo">
    .
    .
    .
    <item name="android:actionBarWidgetTheme">@style/PopupWrapper</item>
</style>
Run Code Online (Sandbox Code Playgroud)

而已!


aLI*_*IEz 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>
Run Code Online (Sandbox Code Playgroud)


小智 7

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

 app:popupTheme="@style/MyDarkToolbarStyle"
Run Code Online (Sandbox Code Playgroud)

然后在你的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 而不是背景。后者将应用于所有内容(菜单本身和每个菜单项),前者仅适用于弹出菜单。


小智 6

在您的应用主题中,您可以设置 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>
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

155376 次

最近记录:

6 年,11 月 前