Me gustaría cambiar el color de fondo del menú de opciones (overflow) en Android 4.2. He probado todos los métodos pero sigue mostrando el color por defecto establecido por el tema. He utilizado el siguiente código & XML configura.
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 tiene 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 lo que hice mal?
El Generador de estilos de barras de acción, sugerido por Sunny, es muy útil, pero genera un montón de archivos, la mayoría de los cuales son irrelevantes si sólo quieres cambiar el color de fondo.
Así que, profundicé en el zip que genera, y traté de acotar cuáles son las partes que importan, para poder hacer la mínima cantidad de cambios en mi aplicación. A continuación se muestra lo que he encontrado.
En el generador de estilo, el ajuste relevante es Color de la ventana emergente, que afecta a "El menú de desbordamiento**, el submenú y el fondo del panel giratorio".
Continúa y genera el zip, pero de todos los archivos generados, sólo necesitas realmente una imagen, menu_dropdown_panel_example.9.png
, que se parece a esto:
Así pues, añade las versiones de diferente resolución de la misma a res/drawable-*
. (Y quizás renombrarlas como menu_dropdown_panel.9.png
).
Entonces, como ejemplo, en res/values/themes.xml
tendrías lo siguiente, con android:popupMenuStyle
y android:popupBackground
siendo los ajustes 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 se obtiene con esta configuración:
introduzca la descripción de la imagen aquí
Tenga en cuenta que estoy usando Theme.Holo.Light
como tema base. ¡Si utiliza Theme.Holo
(Holo Dark), hay un paso adicional necesario como esta respuesta describe!
Además, si usted (como yo) quiere estilizar toda la Barra de Acción, no sólo el menú, ponga 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+ (nivel de API 14+).
Hay una manera fácil de cambiar los colores en la Actionbar
Utiliza el Generador de ActionBar y copia y pega todos los archivos en tu carpeta res
y cambia el tema en el archivo Android.manifest.
Pude cambiar el color del desbordamiento de la acción con sólo poner 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>