Estoy actualizando mi aplicación con la nueva barra de herramientas de la biblioteca de soporte v21. Mi problema es que la barra de herramientas no proyecta ninguna sombra si no configuro el atributo "elevación". ¿Es ese el comportamiento normal o estoy haciendo algo mal?
Mi código es:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_awesome_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<FrameLayout
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent">
.
.
.
Y en mi Actividad - Método OnCreate:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
android
android-5.0-lollipop
material-design
android-toolbar
Mr. Brightside
fuente
fuente
Respuestas:
Terminé configurando mi propia sombra paralela para la barra de herramientas, pensé que podría ser útil para cualquiera que la buscara:
@ drawable / toolbar_dropshadow:
@ color / color_alizarin
fuente
android:layout_height="4dp"
la altura de la sombra, en lugar de5dp
. En realidad, la elevación es igual a la altura de la sombra que establecesFrameLayout
.Google lanzó la biblioteca de soporte de diseño hace unas semanas y hay una solución ingeniosa para este problema en esta biblioteca.
Agregue la biblioteca de soporte de diseño como una dependencia en
build.gradle
:Agregue lo que
AppBarLayout
proporciona la biblioteca como envoltorio alrededor de suToolbar
diseño para generar una sombra paralela.Aquí está el resultado:
Hay muchos otros trucos con la biblioteca de soporte de diseño.
AndroidX
Como arriba pero con dependencia:
y
com.google.android.material.appbar.AppBarLayout
fuente
AppBarLayout
como un contenedor alrededor delToolbar
no establece ninguna sombra para mí. Tenga en cuenta que no uso un cajón de navegación. ¿Alguna idea de por qué no funciona?No puede usar el atributo de elevación antes de API 21 (Android Lollipop). Sin embargo, puede agregar la sombra mediante programación, por ejemplo, utilizando una vista personalizada ubicada debajo de la barra de herramientas.
@ diseño / barra de herramientas
@ drawable / toolbar_dropshadow
en el diseño de tu actividad
<include layout="@layout/toolbar" />
fuente
@layout/toolbar
ejemplo con el archivo de diseño completo?Use las carpetas / values para aplicar el estilo de sombra correcto según la versión del sistema operativo.
Para dispositivos con menos de 5.0 , use /values/styles.xml para agregar windowContentOverlay al cuerpo de su actividad:
Luego agregue su propia sombra personalizada cambiando su Tema para incluir:
Puede obtener el recurso sombra de la aplicación IO de Google aquí: https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png
Para dispositivos 5.0 y posteriores , use /values-v21/styles.xml para agregar elevación a su barra de herramientas utilizando un estilo de encabezado personalizado:
Tenga en cuenta que en el segundo caso, tuve que crear un estilo MyViewArea vacío para que windowContentOverlay que no se mostrara .
[Actualización: cambiaron los nombres de los recursos y agregaron Google shadow.]
fuente
android:foreground
solo funciona en FrameLayout antes de API 23.Esto me funcionó muy bien:
fuente
Si está configurando el
ToolBar
comoActionBar
, simplemente llame:Nota: Esto debe llamarse después
setSupportActionBar(toolbar);
fuente
setElevation()
aunque solo se define para API-21 +.ViewCompat.setElevation()
y, por lo tanto, solo funcionará en API 21 en adelante.yo añadí
en la descripción de la barra de herramientas y funciona para mí. Usando 5.0+
fuente
Ese es el comportamiento normal. Consulte también las preguntas frecuentes al final de esta publicación .
fuente
Estaba jugando con esto durante horas, esto es lo que funcionó para mí.
Elimine todos los
elevation
atributos de los widgetsappBarLayout
yToolbar
(inclusostyles.xml
si está aplicando algún estilo).Ahora dentro de la actividad, aplique el
elvation
en suactionBar
:Esto debería funcionar.
fuente
setElevation
toma un parámetro como píxeles. Tienes que convertirlo adecuadamente, por ejemplo(int) (3.0 / Resources.getSystem().getDisplayMetrics().density)
También puedes hacer que funcione
RelativeLayout
. Esto reduce un poco la anidación del diseño;)fuente
Todo lo que necesitas es un valor
android:margin_bottom
igualandroid:elevation
. NoAppBarLayout
,clipToPadding
etc. requerido.Ejemplo:
fuente
Para 5.0+: puede usar AppBarLayout con Toolbar. AppBarLayout tiene un atributo de "elevación".
fuente
actionbar_background.xml
agregar al fondo actionbar_style
nombre = "displayOptions"> useLogo | showHome | showTitle | showCustom
agregar a Basetheme
fuente
La mayoría de las soluciones funcionan bien aquí. Me gustaría mostrar otra alternativa similar:
gradle:
Su diseño puede tener una Vista de barra de herramientas y una sombra para ello, a continuación, similar a esto (necesita modificación, por supuesto):
res / drawable-v21 / toolbar_action_bar_shadow.xml
res / drawable / toolbar_action_bar_shadow.xml
res / drawable / msl__action_bar_shadow.xml
styles.xml
MainActivity.kt
Muestra completa aquí , como he notado, el IDE tiene el error de decir que el
foreground
atributo es demasiado nuevo para usarlo aquí.fuente
Tuve un problema similar con la sombra. La sombra es dibujada por el padre directo de AppBarLayout en mi caso. Si la altura del padre es la misma que la de AppBarLayout, no se puede dibujar la sombra. Por lo tanto, verificar el tamaño del diseño principal y quizás la nueva versión del diseño puede resolver el problema. https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/
fuente
La respuesta correcta será agregar
android: backgroundTint = "# ff00ff" a la barra de herramientas con android: background = "@ android: color / white"
Si usa otro color, entonces blanco para el fondo, eliminará la sombra. Nice one Google!
fuente