Как изменить цвет фона в меню опций Action Bar в 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> 

color.xml

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

Вышеуказанный setMenuBackground не оказывает никакого эффекта:

Пример меню

На приведенном выше рисунке я хочу изменить фон меню от черного до синего цвета в панели действий . Как я могу достичь этого, и что я сделал неправильно?

Существует простой способ изменить цвета в Actionbar. Используйте ActionBar Generator и скопируйте весь файл в папку res и измените тему в файле Android.manifest.

Генератор стилей Action Bar , предложенный Sunny , очень полезен, но он генерирует много файлов, большинство из которых не имеют значения, если вы хотите изменить цвет фона.

Итак, я углубился в почтовый индекс, который он создал, и попытался сузить, какие части имеют значение, поэтому я могу внести минимальное количество изменений в свое приложение. Ниже я узнал.


В генераторе стилей соответствующий параметр – Popup color , который влияет на « меню переполнения , подменю и фон панели спиннера».

Введите описание изображения здесь

Продолжайте и создавайте zip, но из всех созданных файлов вам действительно нужно только одно изображение, menu_dropdown_panel_example.9.png , которое выглядит примерно так:

Введите описание изображения здесь

Итак, добавьте разные версии разрешения для res/drawable-* . (И, возможно, переименуйте их в menu_dropdown_panel.9.png .)

Затем, например, в res/values/themes.xml вас будет следующее android:popupBackground с настройками 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> 

И, конечно же, в 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+).

В случае, если люди все еще посещают рабочее решение, вот что сработало для меня: – Это для библиотеки поддержки 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 использует дополнительную оболочку для 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> 

Это оно!

Мой простой трюк, чтобы изменить цвет фона и цвет текста в Popup Menu / Option Menu

 <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 – это 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> 

Я смог изменить цвет переполнения действий, просто поместив шестнадцатеричное значение в:

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

Если вы работаете на последней панели инструментов в андроид-студии, то вот самое маленькое решение. Чтобы изменить цвет меню параметров панели инструментов, добавьте это в свой элемент панели инструментов

  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, а не фон. Последний будет применен ко всему (самому меню и каждому пункту меню), первое относится только к всплывающему меню.

Ниже приведены изменения, требуемые в вашей теме для изменения цвета фона меню меню и переполнения. Вам нужно настроить «андроид: фон» actionBarStyle & popupMenuStyle

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

«Android: colorBackground» достаточно, чтобы изменить фон меню опций