J'ai une RecyclerView
qui développe l'élément de grille suivant:
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginLeft="@dimen/children_tile_border"
Android:layout_marginTop="@dimen/children_tile_border"
Android:clickable="true"
Android:focusable="true"
Android:background="?selectableItemBackground"
tools:ignore="RtlHardcoded">
<com.example.app.ui.widget.SquareImageView
Android:id="@+id/child_picture"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:visibility="visible"
Android:layout_alignParentBottom="true"/>
<LinearLayout
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="68dp"
Android:background="@color/tile_text_background"
Android:gravity="center_vertical"
Android:layout_alignParentBottom="true">
..............
</LinearLayout>
</RelativeLayout>
Mais l'effet d'entraînement n'apparaît que si je règle la visibilité de SquareImageView's
sur invisible. Il semble que l’effet d’ondulation soit dessiné au-dessous de SquareImageView
. Comment puis-je dessiner sur la SquareImageView
?
ajoutez le code ci-dessous à votre mise en page parent
Android:clickable="true"
Android:focusable="true"
Android:background="?attr/selectableItemBackground"
si vous voulez un effet d'entraînement personnalisé, ajoutez ce fichier ripple_custom.xml dans drawable-v21
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="@color/colorHighlight">
<item
Android:id="@Android:id/mask"
Android:drawable="@color/windowBackground" />
</ripple>
pour supporter l'ancienne version, ajoutez ripple_custom.xml dans drawable
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true">
<shape Android:shape="rectangle">
<solid Android:color="@color/colorHighlight" />
</shape>
</item>
<item>
<shape Android:shape="rectangle">
<solid Android:color="@Android:color/transparent" />
</shape>
</item>
</selector>
Changement:
Android:background="?selectableItemBackground"
À:
Android:background="?android:attr/selectableItemBackground"
Et ajoutez ceci à votre SquareImageView
Android:clickable="false"
Nous pouvons envelopper RecyclerView Item dans FrameLayout
et y définir la propriété Android:foreground
. Commander suivant link pour plus de détails. Cela fonctionne assez bien pour moi.
Votre SquareImageView
remplit tout l'espace (width
est match_parent
et height
est wrap_content
) et donc SquareImageView
reçoit l'événement de clic.
Ce qui a bien fonctionné dans mon cas a été de définir l'état False de tous les objets de votre RelativeLayout
:
Android:clickable="false"
Assurez-vous simplement que votre RelativeLayout
gère l'événement click de votre activité. Dans mon code, j'ai défini RelativeLayout
sur view v
et un onClick Listener
dessus pour qu'il puisse gérer CheckBox
dans l'élément de liste.
v.setOnClickListener(this);
Espérons que cela aide tous ceux qui le lisent.
Si vous avez un CardView + ImageView
il suffit d’insérer dans CardView
Android:focusable="true"
Android:foreground="?android:attr/selectableItemBackground"
Et pour RelativeLayout + ImageView
Insérer dans RelativeLayout
Android:clickable="true"
Android:focusable="true"
Android:background="?attr/selectableItemBackground"
Ou
Android:focusable="true"
Android:background="?attr/selectableItemBackground"
Ce code a fonctionné pour moi
Les réponses ci-dessus sont correctes. mais je tiens à recommander l'utilisation d'Android: au premier plan, car il montre l'ondulation devant l'imageView.
Sur votre vue racine, ajoutez ce qui suit.
Android:foreground="@drawable/ripple_effect_color_primary"
Android:clickable="true"
Android:focusable="true"
Je sais que c'est une réponse assez tardive à ce vieux fil. Mais qui sait, quelqu'un pourrait trouver cela utile.