android - que - recyclerview adapter
Cómo configurar el relleno para el widget CardView en Android L (4)
Estoy usando android:paddingLeft
y android:paddingTop
para configurar el relleno del nuevo widget CardView
pero no funciona.
Puedo establecer el margen para todos los controles dentro de CardView
como una solución, pero eso es un problema si hay demasiados controles.
¿Cómo configurar el relleno para el nuevo widget de vista de tarjeta?
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="200dp"
android:paddingLeft="20dp"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="20dp"
android:paddingBottom="@dimen/activity_vertical_margin"
card_view:cardCornerRadius="2dp">
<TextView
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</android.support.v7.widget.CardView>
CardView antes de la vista previa de L utiliza RoundRectDrawableWithShadow
para dibujar su fondo, que anula Drawable.getPadding()
para agregar relleno de sombra. El fondo de la vista se establece a través del código después del inflado, que anula cualquier relleno especificado en XML.
Tienes dos opciones:
- Establezca el relleno en tiempo de ejecución usando
View.setPadding()
y tenga cuidado de ajustar las sombras (¡pero solo antes de la vista previa de L!). - Coloque todo dentro de un diseño que especifique el relleno.
La última opción es la más segura.
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="200dp"
card_view:cardCornerRadius="2dp">
<FrameLayout
android:paddingLeft="20dp"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="20dp"
android:paddingBottom="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</FrameLayout>
</android.support.v7.widget.CardView>
CardView debe manejar esto usando los atributos contentPadding
que viene con :
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="200dp"
card_view:cardCornerRadius="2dp"
card_view:contentPaddingLeft="20dp"
card_view:contentPaddingRight="@dimen/activity_horizontal_margin"
card_view:contentPaddingTop="20dp"
card_view:contentPaddingBottom="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</android.support.v7.widget.CardView>
Esto es lo que funcionó para mí: poner cada elemento en un diseño de marco
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="-4dp">
<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:background="@color/white_three"
android:orientation="vertical"
card_view:cardCornerRadius="2dp"
card_view:cardElevation="@dimen/card_elevation"
card_view:cardMaxElevation="0dp"
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
</android.support.v7.widget.CardView>
Comprueba que card_view sea " http://schemas.android.com/apk/res-auto " y no herramientas, y también establece márgenes negativos en la vista de marco para mantener las sombras: funciona bien.
Si desea utilizar el relleno de CardView en dispositivos pre-L, y hacer que se vea igual en dispositivos Lollipop +, entonces necesitará usar setUseCompatPadding(true)
, o la variante XML cardUseCompatPadding="true"
.
Esto se debe a que "CardView agrega relleno adicional para dibujar sombras en las plataformas antes de L". [1] Por lo tanto, la implementación predeterminada tiene diferentes versiones de API que se ven diferentes y las vistas pueden no alinearse correctamente. Por lo tanto, la forma más fácil de solucionar ese problema son las formas mencionadas anteriormente, o usar márgenes en su lugar.
Código de ejemplo
<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="wrap_context"
card_view:cardUseCompatPadding="true"
card_view:contentPadding="8dp"
card_view:cardCornerRadius="4dp" >
...
</android.support.v7.widget.CardView>