2012-07-12 23 views
14

Estoy incluyendo mi diseño xml de estilo:¿Cómo puedo tener una sombra paralela en mi ActionBar (ActionBarSherlock)?

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <style name="Theme.Styled" parent="Theme.Sherlock"> 
     <item name="actionBarStyle">@style/Widget.MyApp.ActionBar</item> 
     <item name="android:actionBarStyle">@style/Widget.MyApp.ActionBar</item> 

    </style> 

    <style name="Widget.MyApp.ActionBar" parent="Widget.Sherlock.Light.ActionBar"> 
     <item name="titleTextStyle">@style/Widget.MyApp.TitleTextStyle</item> 
     <item name="background">@color/red</item> 
     <item name="android:background">@color/red</item> 
     <item name="windowContentOverlay">@null</item> 
     <item name="android:windowContentOverlay">@null</item> 
    </style> 

    <style name="Widget.MyApp.TitleTextStyle" parent="TextAppearance.Sherlock.Widget.ActionBar.Title"> 
     <item name="android:textColor">@color/white</item> 
     <item name="android:textSize">21sp</item> 
    </style> 

</resources> 

Algunos de la búsqueda a través de Internet sugiere que el uso windowContentOverlay establece en @null. Pero cuando lo uso en el estilo xml, no cambia nada. ¿Alguien puede ayudar a qué hacer?

Respuesta

30

Si desea crear una sombra debajo de la Barra de acciones, debe establecer el parámetro android:windowContentOverlay en el tema de la aplicación (en su código, lo configura incorrectamente en el estilo ActionBar).

En su ejemplo sería:

<style name="Theme.Styled" parent="Theme.Sherlock"> 
     ... 
     <item name="android:windowContentOverlay">@drawable/my_actionbar_shadow</item> 
</style> 

Usando @null valor elimina la sombra.

Esta línea establece la sombra en ActionBar en Android 3.0 y versiones posteriores. Sin embargo, si está utilizando ActionBarSherlock, no funcionará como esperaba. Crearía la sombra en la parte superior de la ventana sobre ActionBarSherlock en dispositivos Android con un sistema anterior a Android 4.0 (aunque ActionBar está presente en la API desde Android 3.0, ActionBarSherlock usa implementación personalizada para todas las versiones de Android anteriores a Android 4.0).

Para crear la sombra debajo de ActionBarSherlock tiene que establecer el parámetro windowContentOverlay en el tema de la aplicación (observe el android: que falta).

<style name="Theme.Styled" parent="Theme.Sherlock"> 
     ... 
     <item name="windowContentOverlay">@drawable/my_actionbar_shadow</item> 
</style> 

Nuevamente, usando @null elimina la sombra.

Aunque esta línea funciona para ActionBarSherlock, no funciona en dispositivos con Android 4.0 y posteriores, no se crea sombra bajo ActionBar en dichos dispositivos. Entonces, ¿cómo combinar estos dos parámetros para obtener la sombra deseada en ActionBar y ActionBarSherlock?

Use resource configuration qualifiers, en su caso utilice los calificadores de la versión de la plataforma. En res/values/styles.xml use el segundo código xml. Y en res/values-v14/styles.xml use el primer código xml. Por lo tanto, la versión de ActionBarSherlock se usa de manera predeterminada (para versiones anteriores a Android 4.0) y la versión de ActionBar se usa para Android 4.0 y versiones posteriores.

Editar: Hay una bug en Android 4.3 (API nivel 18), android:windowContentOverlay no funciona. Se debe arreglar en futuras versiones. En caso de que lo necesite arreglado en Android 4.3, puede encontrar soluciones alternativas vinculadas en el informe de errores.

5

Como respuesta anterior dijo usar "windowContentOverlay" en el tema de la aplicación y NO el estilo de la barra de acciones.

<style name="Theme.Styled" parent="Theme.Sherlock"> 
     ... 
     <item name="windowContentOverlay">@drawable/my_actionbar_shadow</item> 
</style> 

Si desea una sombra realista se puede encontrar uno en el "de la carpeta de Android" /plataformas/android-16/datos/res/dibujable-IPAP/

ab_solid_shadow_holo.9.png y copiarlo a la carpeta dibujable-IPAP entonces el resultado final es

<style name="Theme.Styled" parent="Theme.Sherlock"> 
     ... 
     <item name="windowContentOverlay">@drawable/ab_solid_shadow_holo</item> 
</style> 
+1

La imagen del parche de Android 9 no era demasiado estética, terminé usando la mía. Gracias :) – Mehdiway

3

Además, por encima de API21 (Lollipop), tendrá en este código, también.

getSupportActionBar().setElevation(0); 
Cuestiones relacionadas