Estilos comunes para v10 y v11 +?

Estoy utilizando la biblioteca de soporte v7 para tener una ActionBar en el nivel API 10+ (que es Android 2.3.3+). Ahora, quiero personalizar el aspecto un poco, por lo que agregó un tema de aplicación. Extracto de mis values/styles.xml :

 <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="actionBarStyle">@style/ActionBarStyle</item> </style> <style name="ActionBarStyle" parent="@style/Widget.AppCompat.ActionBar"> <item name="background">@drawable/bg_actionbar</item> </style> 

Esto funciona bien en Android 2.3.3, donde se utiliza el material compat. Sin embargo, en Android 4.3 en un N4 (o un emulador), los estilos no se aplican. Si cambio el archivo styles.xml a:

 <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:actionBarStyle">@style/ActionBarStyle</item> </style> <style name="ActionBarStyle" parent="@style/Widget.AppCompat.ActionBar"> <item name="android:background">@drawable/bg_actionbar</item> </style> 

(Note el prefijo android: añadido) funciona en 4.3, pero no en 2.3 (estilos no aplicados).

¿Hay alguna manera de evitar esto sin especificar cada <item> dos veces, una vez con el prefijo y una vez sin?

Hay un ejemplo perfecto en el sitio de Google Docs:

http://developer.android.com/guide/topics/ui/actionbar.html#StyleExample

 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- the theme applied to the application or activity --> <style name="CustomActionBarTheme" parent="@style/Theme.AppCompat.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> <item name="android:actionBarTabTextStyle">@style/TabTextStyle</item> <item name="android:actionMenuTextColor">@color/actionbar_text</item> <!-- Support library compatibility --> <item name="actionBarStyle">@style/MyActionBar</item> <item name="actionBarTabTextStyle">@style/TabTextStyle</item> <item name="actionMenuTextColor">@color/actionbar_text</item> </style> <!-- general styles for the action bar --> <style name="MyActionBar" parent="@style/Widget.AppCompat.ActionBar"> <item name="android:titleTextStyle">@style/TitleTextStyle</item> <item name="android:background">@drawable/actionbar_background</item> <item name="android:backgroundStacked">@drawable/actionbar_background</item> <item name="android:backgroundSplit">@drawable/actionbar_background</item> <!-- Support library compatibility --> <item name="titleTextStyle">@style/TitleTextStyle</item> <item name="background">@drawable/actionbar_background</item> <item name="backgroundStacked">@drawable/actionbar_background</item> <item name="backgroundSplit">@drawable/actionbar_background</item> </style> <!-- action bar title text --> <style name="TitleTextStyle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"> <item name="android:textColor">@color/actionbar_text</item> </style> <!-- action bar tab text --> <style name="TabTextStyle" parent="@style/Widget.AppCompat.ActionBar.TabText"> <item name="android:textColor">@color/actionbar_text</item> </style> </resources> 

¿Hay alguna manera de evitar esto sin especificar cada <item> dos veces, una vez con el prefijo y una vez sin?

Otra forma sería crear carpetas específicas de res/values-XX .

Dado que la división es la versión 10 y las versiones 10+, puede crear res/values-v10/styles.xml contiene:

 <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="actionBarStyle">@style/ActionBarStyle</item> </style> <style name="ActionBarStyle" parent="@style/Widget.AppCompat.ActionBar"> <item name="background">@drawable/bg_actionbar</item> </style> 

Deje que las versiones 10+ traten con los res/values/styles.xml :

 <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:actionBarStyle">@style/ActionBarStyle</item> </style> <style name="ActionBarStyle" parent="@style/Widget.AppCompat.ActionBar"> <item name="android:background">@drawable/bg_actionbar</item> </style> 

Sin embargo, no es muy diferente de especificar <item></item> dos veces.

Para referencia, puede ver la estructura del proyecto de ActionBarSherlock. Eso debería proporcionarle algunos consejos.

También puede echar un vistazo a: Aplicación de estilos y temas a la interfaz de usuario . Desplácese hasta la subsección Select a theme based on platform version .

Si no he entendido mal su problema, puede colapsarlo juntos de esta manera

 <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:actionBarStyle">@style/ActionBarStyle</item> <item name="actionBarStyle">@style/ActionBarStyle</item> </style> <style name="ActionBarStyle" parent="@style/Widget.AppCompat.ActionBar"> <item name="android:background">@drawable/bg_actionbar</item> <item name="background">@drawable/bg_actionbar</item> </style> 

En mi experiencia, de esta manera eclipse da errores de tiempo de compilación cada vez que cambia algo dentro de styles.xml (debido a la pelusa si recuerdo bien), pero clean and rebuild hacen que esos errores desaparezcan.

  • Android Action Bar: Cambiar el color de los botones de acción
  • ¿Por qué mi 'actionBarTabStyle' personalizado no anula el estilo / tema predeterminado?
  • ActionBarSherlock spinner no seleccionable en ActionBar - Tema relacionado
  • WindowBackground no cambia con el tema
  • "Posible sobregiro: El elemento raíz pinta el fondo"
  • Establecer colores predeterminados en la biblioteca de Android
  • ActionBarSherlock no admite cuadros de diálogo de alerta de luz-tema?
  • Aplicación de tema transparente a la actividad: no se ajusta a pantalla completa en dispositivo
  • Android Honeycomb - Cambiar el estilo de la barra de herramientas
  • Android - cambia el estilo del título de diálogo de todos los diálogos en la aplicación
  • El uso de referencias de tema en XML drawables requiere el nivel de API 21
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.