CardView tiene margen adicional en cada borde en Pre-Lollipop
Aquí hay dos imágenes.
en Lollipop:
- extendiendo la clase cardview muestran el rectángulo blanco alrededor de la tarjeta
- ¿Por qué explotan ViewRecycler onMeasure?
- Android Resalte la tarjeta como modal de diálogo dentro de recyclerview en clic
- El evento OnClick en TextView detiene RippleEffect en CardView
- No se puede eliminar el espacio extra entre los elementos de CardView - Scrollable RecyclerView
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 puedo hacer que WRAP_CONTENT funcione en un RecyclerView
- Cómo utilizar RecyclerView y CardView
- Android CardView con un color de sombra personalizado
- Extraño problema de CardView: ("Error al encontrar: com.android.support:cardview-v7:21.0.+" Error)
- Establecimiento de elevación en XML en AppCompat CardView en Android 5.0
- Cómo configurar el relleno para el widget CardView en Android L
- Android RecyclerView LayoutManager Excepción
- Establecer el contenido al borde de Cardview pre 5.0
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.
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)
- Error al ejecutar MyActivity: falló la sincronización de proyecto de Gradle. Corrija su proyecto e inténtelo de nuevo
- Solución automática de estudio de Android