web-dev-qa-db-fra.com

RecyclerView + CardView + Touch Feedback

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!

23
Rafael Nascimento

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"
39
Eugen Pechanec

Solution 1

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

Solution 2

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.

8
David Miguel

Ajoutez l'attribut foreground:

Android:foreground="?android:attr/selectableItemBackground"
1
Volodymyr Kulyk

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

1
Gilang

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

1
vikas kumar