recyclerview - CardView no muestra Shadow en Android L
implementation cardview (16)
Agregue android: hardwareAccelerated = "true" en su archivo de manifiestos como a continuación funciona para mí
<activity
android:name=".activity.MyCardViewActivity"
android:hardwareAccelerated="true"></activity>
Mi Cardview dentro de Listview no muestra sombra en Android L (Nexus 5). Además, los bordes redondos no se muestran correctamente. Aquí está el código para la vista de 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 ListView xml:
<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í?
Agregue esta línea a CardView ...
card_view:cardUseCompatPadding="true" //for enable shadow
card_view:cardElevation="9dp" // this for how much shadow you want to show
Consejos
Puede evitar layout_marginTop y layout_marginBottom ya que la sombra misma ocupa un poco de espacio hacia arriba y hacia abajo. La cantidad de espacio se define por la cantidad que usará en card_view: cardElevation = "ndp".
Happy Coding (:
Creo que si primero revisas tu manifiesto si escribiste
android:hardwareAccelerated="false"
deberías hacer que sea
true
tener sombra para la tarjeta Como esta respuesta
here
Después de revisar los documentos nuevamente, finalmente encontré la solución.
Simplemente agregue
card_view:cardUseCompatPadding="true"
a su
CardView
y aparecerán sombras en los dispositivos Lollipop.
Lo que sucede es que el área de contenido en un
CardView
toma diferentes tamaños en dispositivos pre-lollipop y lollipop.
Entonces, en los dispositivos de piruleta, la sombra está realmente 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 hace visible.
Mi código xml es como:
<android.support.v7.widget.CardView
android:id="@+id/media_card_view"
android:layout_width="match_parent"
android:layout_height="130dp"
card_view:cardBackgroundColor="@android:color/white"
card_view:cardElevation="2dp"
card_view:cardUseCompatPadding="true"
>
...
</android.support.v7.widget.CardView>
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í:
CardView card = new CardView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
if (Build.VERSION_CODES.LOLLIPOP == Build.VERSION.SDK_INT) {
params.setMargins(shadowSize, shadowSize, shadowSize,
shadowSize);
} else {
card.setMaxCardElevation(shadowSize);
}
card.setCardElevation(shadowSize);
card.setLayoutParams(params);
En primer lugar, asegúrese de que las siguientes dependencias se hayan agregado y compilado correctamente en el archivo build.gradle
dependencies {
...
compile ''com.android.support:cardview-v7:21.0.+''
}
y después de esto intente el siguiente código:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_margin="5dp"
android:orientation="horizontal"
card_view:cardCornerRadius="5dp">
</android.support.v7.widget.CardView
el problema aumenta en Android L porque el atributo layout_margin no se agrega
Finalmente pude obtener sombras en el dispositivo Lollipop agregando margen a la vista de la tarjeta. Aquí está el diseño final de la vista de tarjeta:
<?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"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginTop="@dimen/padding_small"
android:layout_marginBottom="@dimen/padding_small"
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>
La vista de tarjeta no puede mostrar sombras debido a que
RelativeLayout
está en la sombra de la vista de tarjeta.
Para mostrar la sombra, agregue márgenes en la vista de su Tarjeta.
Por ejemplo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="8dp">
</android.support.v7.widget.CardView>
</RelativeLayout>
Mi vista de reciclado tardó en cargarse, así que al leer .com cambié hardware Acelerado a "falso" y la elevación no se muestra en el dispositivo. El cambio de nuevo a la verdad. Esto funciona para mi.
No olvides que para dibujar sombras debes usar
hardwareAccelerated
Dibujo
hardwareAccelerated
Consulte Aceleración de hardware de Android para más detalles.
Puede agregar esta línea de código para shadow en la vista de tarjeta
card_view:cardElevation="3dp"
Abajo tienes un ejemplo
<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"
card_view:cardElevation="3dp"
card_view:cardCornerRadius="4dp">
¡Espero que esto ayude!
Puedes probar agregando esta línea
card_view:cardUseCompatPadding="true"
Todo el código será así
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_margin="5dp"
android:orientation="horizontal"
card_view:cardUseCompatPadding="true"
card_view:cardCornerRadius="5dp">
</android.support.v7.widget.CardView
Simplemente agregue estas etiquetas:
app:cardElevation="2dp"
app:cardUseCompatPadding="true"
Entonces se convirtió en:
<android.support.v7.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardBackgroundColor="?colorPrimary"
app:cardCornerRadius="3dp"
app:cardElevation="2dp"
app:cardUseCompatPadding="true"
app:contentPadding="1dp" />
compruebe el hardware Acelerado en manifiesto, hágalo verdadero, haciéndolo falso elimina las sombras, cuando la sombra falsa aparece en la vista previa xml pero no en el teléfono.
mueva su atributo "uses-sdk" en la parte superior del manifiesto como la respuesta a continuación https://.com/a/27658827/1394139
use la
app:cardUseCompatPadding="true"
dentro de su vista de tarjeta.
Por ejemplo
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="@dimen/cardviewMarginRight"
app:cardBackgroundColor="@color/menudetailsbgcolor"
app:cardCornerRadius="@dimen/cardCornerRadius"
app:cardUseCompatPadding="true"
app:elevation="0dp">
</android.support.v7.widget.CardView>