Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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" > 

  • Cómo traer imageView delante de cardview? Cuando ambos son de Disposición Relativa childs
  • Obtener el ancho de CardView en Adapter.onBindViewHolder
  • Expandir y contraer CardView
  • LinearLayout marcado si se utiliza en CardView
  • Visualización de widgets de interfaz de usuario en Cardview en android L
  • CardView layout_width = "match_parent" no coincide con el ancho de RecyclerView padre
  • Cómo configurar el relleno para el widget CardView en Android L
  • Android RecyclerView CardView StaggedGridLayoutManager: desplazamiento de columna independiente
  • 6 Solutions collect form web for “CardView tiene margen adicional en cada borde en Pre-Lollipop”

    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)

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.