La couleur d’arrière-plan de CardView n’est pas respectée

En bref:

Comment pouvons-nous définir les états de couleur de la propriété cardBackgroundColor de CardView (dans un layout ListView, dans ce cas)?

(J’utilise l’aperçu du développeur RC1 d’Android L, sur un téléphone avec 4.4 installé, et “com.android.support:cardview-v7:21.0.0-rc1″ dans build.gradle)

Plus long:

Dans la mise en page CardView, nous définissons le rayon de coin et la couleur d’arrière-plan de CardView via cardCornerRadius et cardBackgroundColor.

Cependant, la couleur d’arrière-plan ne correspond pas aux états sélectionnés, par exemple si l’élément de la liste est enfoncé, par exemple.

Si, dans la vue interne de CardView, vous définissez une couleur d’arrière-plan et des états associés qui sont respectés, il s’affichera cependant sur les coins que vous avez définis dans CardView.

Alors, comment pouvons-nous nous assurer que les états de cardBackgroundColor de CardView sont respectés?

Voici la couleur utilisée pour cardBackgroundColor, colour_with_states.xml:

         

Et la mise en page qui utilise CardView:

     

Bien que cela ne soit pas idéal, puisque les bords ne sont pas arrondis, vous pouvez append des commentaires tactiles à un CardView comme ceci:

  //Nested View ...  

Ajout de l’ android:foregroundandroid:foreground et android:clickable atsortingbuts android:clickable à la CardView .

Cela a également un effet secondaire négatif en ce que l’atsortingbut android:clickable clickable remplace tout clickListener, et par conséquent, ces clickListeners ne sont pas déclenchés.

Mettre à jour

J’ai quelques exemples d’implémentations CardView

Loop ( https://github.com/lawloretienne/Loop ) – https://github.com/lawloretienne/Loop/blob/master/app/src/main/res/layout/category_card.xml

QuickReturn ( https://github.com/lawloretienne/QuickReturn ) – https://github.com/lawloretienne/QuickReturn/blob/master/sample/src/main/res/layout/activity_quick_return.xml

Mise à jour 2

Après plus de recherches, j’ai trouvé une bonne solution pour CardViews sur toutes les versions d’API, y compris pré-Lollipop.

https://medium.com/@etiennelawlor/layout-tips-for-pre-and-post-lollipop-bcb2e4cdd6b2#.9h0v1gmaw

Parfois, vous souhaiterez peut-être que CardView ait un retour tactile visuel. La solution android:foreground="?android:attr/selectableItemBackground" est parfaite pour cela.

Cependant, vous pouvez envisager d’utiliser drawSelectorOnTop(true) avec votre ListView. Cela ne nécessitera aucun changement sur votre CardView .

Faites-moi savoir si des précisions sont nécessaires.

Voici ma façon de résoudre votre problème.

Tout d’abord, créer une classe personnalisée nommée CustomCardView étend CardView

drawableStateChanged() ensuite la méthode drawableStateChanged() , modifiez la couleur d’arrière-plan de la carte en appelant la méthode setCardBackgroundColor() lorsque l’état de la presse de la carte a changé.

Enfin, remplacez CardView par cette CustomCardView dans votre fichier de mise en page.

Le seul inconvénient de cette solution est que cardview ne peut pas afficher l’effet de pression sur Android 5.0 et supérieur.

voici mon code:

 public class CustomCardView extends CardView { public CustomCardView(Context context) { super(context); // TODO Auto-generated constructor stub } public CustomCardView(Context context, AtsortingbuteSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public CustomCardView(Context context, AtsortingbuteSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO Auto-generated constructor stub } @Override protected void drawableStateChanged() { super.drawableStateChanged(); if (isPressed()) { this.setCardBackgroundColor(getContext().getResources().getColor(R.color.card_view_pressed)); } else { this.setCardBackgroundColor(getContext().getResources().getColor(R.color.card_view_normal)); } } 

}

Une solution de contournement que j’ai utilisée consistait à effectuer les modifications de l’interface utilisateur par programme en remplaçant le gestionnaire d’événements View.OnTouchListener OnTouch () dans mon ViewHolder personnalisé.

 @Override public boolean onTouch (View v, MotionEvent event) { int action = event.getActionMasked(); if (action == MotionEvent.ACTION_DOWN) { mCardView.setCardBackgroundColor(STATE_PRESSED_COLOR); } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { mCardView.setCardBackgroundColor(DEFAULT_COLOR); } return false; } 

** Il suffit d’append les lignes à l’intérieur de la vue carte **

  android:clickable="true" android:focusableInTouchMode="true" android:foreground="?android:attr/selectableItemBackground" 

J’ai utilisé une forme de rectangle avec le même rayon d’angle que la carte de visite. Et puis, le format XML dessiné comme arrière-plan pour la vue interne de la carte. L’arrière-plan ne s’affiche pas sur le coin de la carte, bien que j’aie toujours un petit remplissage entre la carte et sa vue interne.

entrer la description de l'image ici

Si vous regardez la définition de la propriété carBackgroundColor, au moins dans la bibliothèque de support Android, c’est:

       

Ici, il est dit qu’il ne prend que de la couleur pour cardBackgroundValue. J’imagine que cela signifie que le sélecteur n’est pas respecté mais passe à la valeur par défaut, c.-à-d. couleur au bas de votre sélecteur.

Utilisez android:foreground au lieu de android:background dans votre . ci-dessous sont un exemple de code d’une CardView.

   // others view component