Quelqu'un a-t-il résolu le mystère du CardView sans rétroaction tactile lorsqu'il se trouve à l'intérieur d'un RecyclerView?
J'ai un RecyclerView avec un tas de CardViews (un CardList). Lorsque je clique sur une carte CardView, je démarre une autre activité. Cela fonctionne très bien, mais je ne vois aucun retour tactile lorsque je clique sur CardView.
Juste à temps, j'ai déjà configuré mon CardView (XML) avec ceux-ci:
Android:clickable="true"
Android:background="?android:selectableItemBackground"
Merci!
Contexte:
CardView
ignore Android:background
en faveur de app:cardBackground
qui ne peut être que de la couleur. La bordure et l'ombre font en fait partie de l'arrière-plan, vous ne pouvez donc pas définir les vôtres.
Solution:
Rendez la disposition à l'intérieur du CardView
cliquable au lieu de la carte elle-même. Vous avez déjà écrit les deux attributs nécessaires pour cette mise en page:
Android:clickable="true"
Android:background="?android:selectableItemBackground"
Comme l'a proposé @Eugen, vous pouvez rendre la disposition à l'intérieur de CardView
cliquable, vous pouvez donc utiliser Android:background
:
<Android.support.v7.widget.CardView
...
Android:clickable="true"
Android:background="?attr/selectableItemBackground">
Si vous ne voulez pas perdre l'écouteur de clic d'élément en rendant la disposition dans CardView
cliquable, vous pouvez utiliser Android:foreground
:
<Android.support.v7.widget.CardView
...
Android:clickable="true"
Android:foreground="?attr/selectableItemBackground">
Extra: vous pouvez utiliser "?attr/selectableItemBackgroundBorderless"
au lieu de "?attr/selectableItemBackground"
si vous ne voulez pas du masque rectangle.
Ajoutez l'attribut foreground
:
Android:foreground="?android:attr/selectableItemBackground"
créer le sélecteur "drawable/card_foreground_selector"
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true">
<shape Android:shape="rectangle">
<solid Android:color="#18000000"/>
<corners Android:radius="@dimen/card_radius" />
</shape>
</item>
<item Android:state_focused="true" Android:state_enabled="true">
<shape Android:shape="rectangle">
<solid Android:color="#0f000000"/>
<corners Android:radius="@dimen/card_radius" />
</shape>
</item>
</selector>
et créez "drawable/card_foreground.xml" ( vous devrez ajuster les valeurs d'encart en fonction de l'élévation de votre carte)
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:drawable="@drawable/card_foreground_selector"
Android:insetLeft="2dp"
Android:insetRight="2dp"
Android:insetTop="3dp"
Android:insetBottom="3dp"/>
modifier votre article (item.xml)
<Android.support.v7.widget.CardView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/card_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:contentPadding="8dp"
Android:foreground="@drawable/card_foreground">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
// ..
</LinearLayout>
</Android.support.v7.widget.CardView>
vous pouvez voir le message d'origine ici
Les deux approches devraient fonctionner de la même manière.
1) Si vous voulez que cardview réponde aux commentaires tactiles, utilisez celui-ci dans cardview .
Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
Android:focusable="true"
mais si l'approche ci-dessus ne fonctionne pas, vous pouvez définir cette propriété sur enfant groupe de vues (linéaire/relatif, etc.) de cardview .
Android:background="?android:attr/selectableItemBackground"
Android:clickable="true"
Android:focusable="true"
Mais alors itemView
de ViewHolder ne répondra pas à l'événement touch. depuis son été consommé par la vue enfant, vous devez donc définir clicklistener sur childview pour continuer à travailler avec listener dans l'adaptateur de recyclage, de cette façon nous pouvons activer les événements tactiles et cliquables sur ranger les articles de recyclage dans notre adaptateur.
si vous avez du mal à suivre le toucher et à cliquer sur les vues dans cardview avec ondulation, cela pourrait être utile. Problème de rétroaction tactile
2.) La deuxième approche consiste à utiliser la manière traditionnelle d'utiliser le sélecteur tactile personnalisé dessinable et défini comme arrière-plan.
<?xml version="1.0" encoding="utf-8"?>
<ripple
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="your ripple color">
<item>
<selector>
<item Android:state_selected="true">
<color Android:color="your selected color" />
</item>
<item Android:state_activated="true">
<color Android:color="your selected color" />
</item>
<item>
<color Android:color="your normal color" />
</item>
</selector>
</item>
</ripple>
Documents Ripple Drawable