Has anybody solved the mystery of the CardView without touch feedback when it's inside a RecyclerView?
I have a RecyclerView with a bunch of CardViews (a CardList). When I click on any CardView, I start another Activity. That's working pretty fine, but I can't see any touch feedback when I click on the CardView.
Just in time, I've already configured my CardView (XML) with these:
android:clickable="true"
android:background="?android:selectableItemBackground"
Thanks!
Background:
The CardView
ignores android:background
in favor of app:cardBackground
which can only be color. The border and shadow are in fact part of the background so you cannot set your own.
Solution:
Make the layout inside the CardView
clickable instead of the card itself. You already wrote both attributes needed for this layout:
android:clickable="true"
android:background="?android:selectableItemBackground"
As @Eugen proposed, you can make the layout inside CardView
clickable, so then you can use android:background
:
<android.support.v7.widget.CardView
...
android:clickable="true"
android:background="?attr/selectableItemBackground">
If you don't want to lose the item click listener by making the layout inside CardView
clickable, you can use android:foreground
:
<android.support.v7.widget.CardView
...
android:clickable="true"
android:foreground="?attr/selectableItemBackground">
Extra: you can use "?attr/selectableItemBackgroundBorderless"
instead of "?attr/selectableItemBackground"
if you don't want the rectangle mask.
create selector "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>
and create "drawable/card_foreground.xml" (you'll need to tweak inset values according to elevation of your card)
<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"/>
modify your item (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>
you can view original post here
Add foreground
attribute:
android:foreground="?android:attr/selectableItemBackground"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With