Voici deux photos.
sur Lollipop:
sur 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"
>
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!
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.
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.
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.
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
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)
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);
}
}
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);
}