studio - ¿Cómo cambiar el color de fondo del menú de opciones de la barra de acciones en Android 4.2?
change color menu android (14)
Me gustaría cambiar el color de fondo del menú de opciones (desbordamiento) en Android 4.2. He intentado con todos los métodos pero sigue mostrando el color predeterminado establecido por el tema. Usé el siguiente código y las configuraciones 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>
El setMenuBackground anterior no está teniendo ningún efecto:
En la imagen de arriba, quiero cambiar el fondo del menú de negro al color azul en la barra de acción . ¿Cómo puedo lograr esto y qué hice mal?
¡Manera rápida!
styles.xml
<style name="popupTheme" parent="Theme.AppCompat.Light">
<item name="android:background">@color/colorBackground</item>
<item name="android:textColor">@color/colorItem</item>
</style>
A continuación, agregue estos estilos específicos a sus estilos de AppTheme
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="popupTheme">@style/popupTheme</item>
</style>
¡HECHO!
Agregue los siguientes a su 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>
Cambia el tema en activity_main.xml
solamente.
android:theme="@style/Custom_Theme"
El generador de estilos Action Bar , sugerido por Sunny , es muy útil, pero genera una gran cantidad de archivos, la mayoría de los cuales son irrelevantes si solo quiere cambiar el color de fondo.
Por lo tanto, profundicé en el zip que genera, y traté de reducir las partes importantes, por lo que puedo hacer la cantidad mínima de cambios en mi aplicación. Debajo está lo que descubrí.
En el generador de estilos, la configuración relevante es el color emergente , que afecta al " menú de desbordamiento , submenú y fondo del panel giratorio".
Continúa y genera el zip, pero de todos los archivos generados, solo necesitas una imagen, menu_dropdown_panel_example.9.png
, que se ve así:
Por lo tanto, agregue las diferentes versiones de res/drawable-*
a res/drawable-*
. (Y tal vez cambiarles el nombre a menu_dropdown_panel.9.png
)
Luego, como ejemplo, en res/values/themes.xml
tendría lo siguiente, con android:popupMenuStyle
y android:popupBackground
como configuración de la clave.
<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>
Y, por supuesto, en AndroidManifest.xml
:
<application
android:theme="@style/MyAppActionBarTheme"
... >
Lo que obtienes con esta configuración:
Tenga en cuenta que estoy utilizando Theme.Holo.Light
como tema base. Si usa Theme.Holo
(Holo Dark), ¡se necesita un paso adicional como lo describe esta respuesta !
Además, si usted (como yo) quería res/drawable/blue_action_bar_background.xml
toda la barra de acciones, no solo el menú, coloque algo como esto en 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>
Funciona muy bien al menos en Android 4.0+ (API nivel 14+).
En caso de que esté trabajando en la última barra de herramientas en el estudio de Android, esta es la solución más pequeña. Para cambiar el color del menú de opciones de la barra de herramientas, agréguelo al elemento de la barra de herramientas.
app:popupTheme="@style/MyDarkToolbarStyle"
Luego, en su styles.xml, defina el estilo del menú emergente
<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>
Tenga en cuenta que debe usar colorBackground no de fondo. Esto último se aplicaría a todo (el menú en sí y cada elemento del menú), el primero se aplica solo al menú emergente.
En caso de que las personas sigan visitando para obtener una solución que funcione, esto es lo que funcionó para mí: - Esto es para la biblioteca de soporte de Appcompat. Esto es una continuación del estilo de ActionBar explicado aquí
A continuación se muestra el archivo 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>
y así es como se ve: el color de fondo de MenuItem es celeste y el color del texto de MenuItem es rosa con texto como 25sp: -
Hay una manera fácil de cambiar los colores en Actionbar Use ActionBar Generator y copie y pegue todos los archivos en su carpeta res
y cambie su tema en el archivo Android.manifest.
Los siguientes son los cambios requeridos en su tema para cambiar la barra de acciones y el color de fondo del menú de desbordamiento. Necesita configurar "android: background" de 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>
Mi truco simple para cambiar el color de fondo y el color del texto en Menú emergente / Menú de opciones
<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>
Prueba este código Agregue este fragmento a sus res> valores> 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>
Y en Manifest.xml agregue el siguiente fragmento debajo de la aplicación
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
Pude cambiar el desbordamiento del color de la acción simplemente poniendo el valor hexadecimal en:
<!-- 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>
Puede aplicar estilos y temas en el elemento de menú de desbordamiento según se detalla a continuación. El menú de OverFlow es ListView entonces, podemos aplicar el tema según la vista de lista.
Aplicar el código siguiente en 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>
Si lees esto, es probable que sea porque todas las respuestas anteriores no funcionaron para tu tema basado en Holo Dark .
Holo Dark usa un contenedor adicional para PopupMenus, por lo que después de hacer lo que Jonik le sugirió , debe agregar el siguiente estilo a su archivo ''xml'':
<style name="PopupWrapper" parent="@android:style/Theme.Holo">
<item name="android:popupMenuStyle">@style/YourPopupMenu</item>
</style>
Luego haz referencia en tu bloque de temas:
<style name="Your.cool.Theme" parent="@android:style/Theme.Holo">
.
.
.
<item name="android:actionBarWidgetTheme">@style/PopupWrapper</item>
</style>
¡Eso es!
También me impresionó este mismo problema, finalmente obtuve una solución simple. acaba de agregar una línea al estilo de la barra de acción.
<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" es suficiente para cambiar el fondo del menú de opciones
<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>