Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change the background color of Action Bar's Option Menu in Android 4.2?

I'd like to change the background color of the option (overflow) menu in Android 4.2. I have tried all the methods but it is still showing the default color set by the theme. I used the following code & XML configs.

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> 

The above setMenuBackground is not taking any effect:

Menu Sample

In the above picture, I want to change the menu background from black to the blue color in the Action Bar. How can I achieve this, and what I did do wrong?

like image 491
MKD Avatar asked Oct 29 '13 13:10

MKD


1 Answers

In case people are still visiting for a working solution, here is what worked for me:-- This is for Appcompat support library. This is in continuation to ActionBar styling explained here

Following is the styles.xml file.

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

and this is how it looks--MenuItem background color is skyblue and MenuItem text color is pink with textsize as 25sp:--

enter image description here

like image 109
Nicks Avatar answered Oct 10 '22 10:10

Nicks