web-dev-qa-db-fra.com

CardView a une marge supplémentaire dans chaque Edge sur Pre-Lollipop

Voici deux photos.

sur Lollipop: on Lollipop:

sur Pre-Lollipop: on Pre-Lollipop

nous pouvons voir que c'est juste à côté de l'écran sur Lollipop. C'est ce que je veux. mais sur le dispositif Pre-Lollipop, il a une marge supplémentaire à l'écran Edge. avez-vous une expérience? Merci.

voici la mise en page 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"
        >
25
Jaden Gu

Alors, ça se passe parfaitement bien sur KitKat, appareil samsung pour être précis.

J'ai essayé card_view:cardUseCompatPadding="true" mais en vain. Ça n'a pas marché!

Ensuite, j'ai découvert à partir d'un post stackoverflow ce card_view:cardPreventCornerOverlap="false" et VOILA! Travaillé! Il n'y avait pas de coins ronds (depuis, je n'en voulais pas car la carte a un fond d'image).

La morale est qu'un rembourrage supplémentaire est dû à ces petits coins ronds qui doivent être désactivés. Fondamentalement, ce n'est pas un défaut plutôt une contrainte de conception!

RÉPONSE ORIGINALE SOF

Image: Notez que les coins supérieurs sont des bords (une vue qui a une couleur et une image en arrière-plan) tandis que le bas n'a que TextViews et aucun arrière-plan, donc les coins arrondis. Cela signifie que si une vue demande match_parent à l'intérieur de CardView, card_view:cardPreventCornerOverlap="false" permettra de le reprendre dans les coins affectés.

enter image description here

22
sud007

Avant L, CardView ajoute un remplissage à son contenu et dessine des ombres dans cette zone. Ce montant de remplissage est égal à maxCardElevation + (1 - cos45) * cornerRadius sur les côtés et maxCardElevation * 1.5 + (1 - cos45) * cornerRadius en haut et en bas.

De la référence CardView ici

Essayez de définir une marge gauche négative sur le CardView comme ceci

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

Vous devrez peut-être ajuster la marge pour obtenir le résultat souhaité.

PS, c'est une sorte de façon hack-y de le faire.

18
shemarcl

Je me rends compte que cela a déjà été répondu, mais je voudrais ajouter qu'en plus de card_view:cardPreventCornerOverlap="false", J'ai également dû définir CardView.setMaxCardElevation(0) pour se débarrasser des marges sur pré-Lollipop. La définition de l'élévation uniquement à 0 n'a pas fonctionné. J'utilise la bibliothèque de support v23.4.0.

14
okacat

Essayez avec card_view:cardUseCompatPadding="true"

si nous définissons cette propriété sur true, margin fonctionne de la même manière sur toutes les versions.

note du développeur

Ajoutez également un rembourrage dans l'API v21 + pour avoir les mêmes mesures avec les versions précédentes.

source documents

13
Sanket Kachhela

Si le comportement Android 4 (pré-Lollipop) est souhaité, ajouter app:cardUseCompatPadding="true" au CardView devrait le corriger.

Si le comportement Android 5+ est souhaité (qui est en fait le bon comportement des vues de carte selon les directives matérielles), la même chose ne peut pas être facilement obtenue. J'utilise généralement ce correctif pour éviter définir plusieurs fichiers de mise en page et avoir une sortie raisonnable sur tous les appareils:

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

et en normal values/dimens.xml fichier que nous devrions avoir:

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

et en values-v21/dimens.xml:

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

notez que les chiffres -8dp et -12dp il faudra peut-être ajuster votre mise en page, car cela dépend de l'élévation, etc.

Ce n'est qu'une solution pour éviter les rembourrages laids dans Android 4 vues, sans utiliser différentes vues dans différents fichiers de disposition (ce qui rend généralement le code plus difficile à maintenir)

5
Iman Akbari

Pour résoudre le problème de "l'espace fantôme" pour les versions PRE-L, vous pouvez mettre à jour dynamiquement la marge CardView par des valeurs négatives pour compenser l'espace.

Pour obtenir l'espace réel de l'ombre:

shadowSpaceLeft = getPaddingLeft() - getContentPaddingLeft();

Pour fixer la marge:

layoutParams.leftMargin -= shadowSpaceLeft;

Cela fonctionnera pour toutes les versions Android puisque nous obtenons les valeurs de remplissage et les valeurs contentPadding de manière dynamique.

Par exemple, voici une classe qui le fait chaque fois que nous définissons de nouveaux paramètres de mise en page:

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);
    }
}
4
Eyal Biran

ajoutez simplement ceci dans votre code pour les versions pré Lollipop:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop)
    {
        cardView.setMaxCardElevation(0f);
        cardView.setPreventCornerOverlap(false);
    }
0
AREF