CardView tiene margen adicional en cada borde en Pre-Lollipop

Aquí hay dos imágenes.

en Lollipop: en Lollipop:

en Pre-Lollipop: en Pre-Lollipop

podemos ver que está cerca del lado de la pantalla en Lollipop. eso es lo que quiero. pero en el dispositivo Pre-Lollipop, tiene margen adicional al borde de la pantalla. ¿Tienen ustedes alguna experiencia? gracias.

aquí está la disposición xml:

<android.support.v7.widget.CardView android:id="@+id/card_title_schedule" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_centerVertical="true" app:cardCornerRadius="0dp" app:cardBackgroundColor="@color/colorAccent" > 

Así que aquí va perfectamente bien en Kitkat, Samsung dispositivo para ser precisos.

He intentado card_view:cardUseCompatPadding="true" pero no sirvió. No funcionó!

Entonces descubrí de un poste stackoverflow este card_view:cardPreventCornerOverlap="false" y VOILA! ¡Trabajó! No había esquinas redondas (desde, yo quería ninguno como la tarjeta tiene un fondo de imagen).

La moraleja es, un relleno adicional es debido a esas diminutas esquinas redondas que, necesitan ser desactivadas. Básicamente que no es un defecto más bien una restricción de diseño!

RESPUESTA ORIGINAL SOF

Imagen: Aviso que las esquinas superiores son los bordes (una vista que tiene color y una imagen en el fondo), mientras que la parte inferior tiene TextViews y sin antecedentes por lo tanto, las esquinas redondas. Eso significa que si una vista está solicitando match_parent dentro de CardView, card_view:cardPreventCornerOverlap="false" permitirá que se tome en las esquinas afectadas.

Introduzca aquí la descripción de la imagen

Antes de L, CardView agrega relleno a su contenido y dibuja sombras a esa área. Esta cantidad de relleno es igual a maxCardElevation + (1 – cos45) * cornerRadius en los lados y maxCardElevation * 1.5 + (1 – cos45) * cornerRadius en la parte superior e inferior.

De la referencia CardView aquí

Intente establecer un margen izquierdo negativo en el CardView esta manera

<android.support.v7.widget.CardView android:id="@+id/card_title_schedule" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_centerVertical="true" app:cardCornerRadius="0dp" app:cardBackgroundColor="@color/colorAccent" app:cardUseCompatPadding="true" android:layout_marginLeft="-2dp" />

Puede que tenga que ajustar el margen para obtener el resultado deseado.

PS, esto es una especie de hack-y manera de hacerlo.

Pruebe con card_view:cardUseCompatPadding="true"

si establecemos esta propiedad en true, el margen funciona igual en todas las versiones.

nota del desarrollador

Agregue relleno en API v21 + para tener las mismas medidas con versiones anteriores.

documentos de origen

Me doy cuenta de esto ya ha sido contestada, pero me gustaría añadir que además de card_view:cardPreventCornerOverlap="false" , también tuve que establecer CardView.setMaxCardElevation(0) para deshacerse de los márgenes de pre-Lollipop. El ajuste de la elevación sólo a 0 no funcionó. Estoy utilizando la biblioteca de soporte v23.4.0.

Para resolver el problema de "espacio de sombra" para las versiones de PRE-L, puede actualizar dinámicamente el margen de CardView con valores negativos para compensar el espacio.

Para obtener el espacio de sombra real:

 shadowSpaceLeft = getPaddingLeft() - getContentPaddingLeft(); 

Para corregir el margen:

 layoutParams.leftMargin -= shadowSpaceLeft; 

Esto funcionará para todas las versiones de Android ya que estamos recibiendo dinámicamente los valores de relleno y los valores de contentPadding.

Por ejemplo, aquí hay una clase que lo hace cada vez que establecemos nuevos parámetros de diseño:

 public class NoPaddingCardView extends CardView { public NoPaddingCardView(Context context) { super(context); init(); } public NoPaddingCardView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public NoPaddingCardView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { // Optional: Prevent pre-L from adding inner card padding setPreventCornerOverlap(false); // Optional: make Lollipop and above add shadow padding to match pre-L padding setUseCompatPadding(true); } @Override public void setLayoutParams(ViewGroup.LayoutParams params) { // FIX shadow padding if (params instanceof MarginLayoutParams) { MarginLayoutParams layoutParams = (MarginLayoutParams) params; layoutParams.bottomMargin -= (getPaddingBottom() - getContentPaddingBottom()); layoutParams.leftMargin -= (getPaddingLeft() - getContentPaddingLeft()); layoutParams.rightMargin -= (getPaddingRight() - getContentPaddingRight()); layoutParams.topMargin -= (getPaddingTop() - getContentPaddingTop()); } super.setLayoutParams(params); } } 

Si se desea el comportamiento de Android 4 (pre-lollipop), agregar app:cardUseCompatPadding="true" al CardView debería arreglarlo.

Si se desea el comportamiento de Android 5+ (que es en realidad el comportamiento correcto de las vistas de la tarjeta de acuerdo con las directrices del material), la misma cosa no se puede lograr fácilmente. Normalmente, uso esta corrección para evitar la definición de varios archivos de diseño y tener salida razonable en todos los dispositivos:

 <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" app:contentPaddingRight="@dimen/fix_cardview" app:contentPaddingLeft="@dimen/fix_cardview" app:contentPaddingTop="@dimen/fix_cardview_vertical" app:contentPaddingBottom="@dimen/fix_cardview_vertical" /> 

y en values/dimens.xml normales values/dimens.xml debemos tener:

 <dimen name="fix_cardview">-8dp</dimen> <dimen name="fix_cardview_vertical">-12dp</dimen> 

y en values-v21/dimens.xml :

 <dimen name="fix_cardview">0dp</dimen> <dimen name="fix_cardview_vertical">0dp</dimen> 

tenga en cuenta que los números -8dp y -12dp tendrán que ser ajustados para su diseño, ya que dependen de la elevación, etc.

Esto es sólo una solución para evitar feos rellenos en Android 4 vistas, sin utilizar diferentes vistas en diferentes archivos de diseño (que por lo general hace que el código más difícil de mantener)

  • No se encontró ningún recurso que coincida con el nombre dado (en 'cardBackgroundColor' con el valor '? Android: attr / colorBackgroundFloating')
  • Programar '? SelectableItemBackground' en la vista de Android
  • Cómo personalizar cardview?
  • Error al agregar CardView al diseño
  • Android | CardView se mantiene por encima de TextView
  • Expandiendo / Colapsando CardView con un gesto de clic o de deslizamiento (Android)?
  • Corners ImgeView fit dentro de CardView no tiene radio como las esquinas de CardView en Android
  • CardView Haga clic en estado no funciona
  • No hay adaptador conectado; Saltar el diseño
  • CardView layout_margin no funciona
  • Fondo transparente en CardView - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.