Mi Cardview dentro de Listview no muestra sombras en Android L (Nexus 5). Además, los bordes redondos no se muestran correctamente. Aquí está el código para la vista del adaptador de Listview:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardBackgroundColor="@android:color/white"
android:foreground="?android:attr/selectableItemBackground"
app:cardCornerRadius="4dp"
app:cardElevation="4dp" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="@dimen/padding_small"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ImageView
android:id="@+id/ivPicture"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tvName"
android:layout_centerHorizontal="true"
android:scaleType="fitCenter" />
<TextView
android:id="@+id/tvDetail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ivPicture"
android:layout_centerHorizontal="true"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin" />
</RelativeLayout>
</android.support.v7.widget.CardView>
Y el xml ListView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/app_bg" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:cacheColorHint="#00000000"
android:divider="@android:color/transparent"
android:drawSelectorOnTop="true"
android:smoothScrollbar="true" />
<ProgressBar
android:id="@+id/progressBarMain"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" /></RelativeLayout>
Funciona bien en dispositivos pre-L con sombra adecuada y esquinas redondeadas. Pero no funciona en un dispositivo Android L. ¿Puedes decir lo que me estoy perdiendo aquí?
Respuestas:
Después de revisar los documentos nuevamente, finalmente encontré la solución.
Simplemente agregue
card_view:cardUseCompatPadding="true"
a suCardView
y aparecerán sombras en los dispositivos Lollipop.Lo que sucede es que el área de contenido
CardView
toma diferentes tamaños en dispositivos pre-piruletas y piruletas. Entonces, en los dispositivos de paleta, la sombra está cubierta por la tarjeta, por lo que no es visible. Al agregar este atributo, el área de contenido permanece igual en todos los dispositivos y la sombra se vuelve visible.Mi código xml es como:
fuente
card_view:cardElevation="2sp"
acard_view:cardElevation="2dp"
?sp
solo debe usarse para tamaños de texto.dp
debe utilizarse para todas las demás dimensiones.No olvides que para dibujar sombras debes usar
hardwareAccelerated
dibujohardwareAccelerated = true
hardwareAccelerated = false
Consulte Aceleración de hardware de Android para obtener más detalles.
fuente
utilizar
app:cardUseCompatPadding="true"
dentro de su vista de tarjeta. Por ejemplofuente
check hardware Acelerado en el manifiesto lo hace verdadero, lo que lo hace falso elimina las sombras, cuando aparece una sombra falsa en la vista previa de xml pero no en el teléfono.
fuente
Agregue esta línea a CardView ....
Consejos
Puede evitar layout_marginTop y layout_marginBottom ya que la sombra en sí ocupa algo de espacio hacia arriba y hacia abajo. La cantidad de espacio se define por cuánto usará en card_view: cardElevation = "ndp".
Codificación feliz (:
fuente
Finalmente pude obtener sombras en el dispositivo Lollipop agregando margen a la vista de tarjeta. Aquí está el diseño de vista de tarjeta final:
fuente
8dp
suficiente?Simplemente agregue estas etiquetas:
Entonces se convierte en:
fuente
Puede agregar esta línea de código para la sombra en la vista de tarjeta
A continuación tienes un ejemplo
¡Espero que esto ayude!
fuente
Puedes probar agregando esta línea
El código completo se verá así
fuente
En mi caso, la sombra no se mostraba en los dispositivos Android L porque no agregué un margen. El problema es que CardView crea este margen automáticamente en <5 dispositivos, así que ahora lo hago así:
fuente
Agregue android: hardwareAccelerated = "true" en su archivo de manifiestos como a continuación, funciona para mí
fuente
En primer lugar, asegúrese de que las siguientes dependencias se hayan agregado y compilado correctamente en el archivo build.gradle
y después de esto prueba el siguiente código:
el problema aumenta en Android L porque el atributo layout_margin no se agrega
fuente
Mi vista de reciclaje tardó en cargarse, así que al leer stackoverflow.com cambié hardwareAccelerated a "falso", entonces la elevación no se muestra en el dispositivo. El volví a cambiar a la verdad. Esto funciona para mi.
fuente
La vista de la carta no puede mostrar la sombra porque
RelativeLayout
está en la sombra de la vista de la carta. Para mostrar la sombra, agregue márgenes en la vista Tarjeta. Por ejemplo:fuente
Creo que si revisa su manifiesto primero, si escribió
android:hardwareAccelerated="false"
, deberíatrue
tener sombra para la tarjeta. Como esta respuesta aquí.fuente
Compruebe que no está utilizando
android:layerType="software"
en su RecyclerView .Cambiarlo me
android:layerType="hardware"
resolvió el problema.fuente
mueva su atributo "uses-sdk" en la parte superior del manifiesto como la siguiente respuesta https://stackoverflow.com/a/27658827/1394139
fuente