在 RecyclerView 中有没有人解决 CardView 之谜而没有触摸反馈?
我有一堆带有一系列CardView的RecyclerView( CardList )。当我点击任何CardView时,我开始另一个活动。这工作得很好,但是当我点击CardView时,我看不到任何触摸反馈。
及时,我已经使用以下内容配置了我的CardView(XML):
android:clickable="true"
android:background="?android:selectableItemBackground"
谢谢!
答案 0 :(得分:37)
<强>背景强>
CardView
忽略android:background
支持app:cardBackground
,而CardView
只能是彩色。边框和阴影实际上是背景的一部分,所以你不能自己设置。
<强>解决方案:强>
使android:clickable="true"
android:background="?android:selectableItemBackground"
可点击内的布局而不是卡片本身。您已经编写了此布局所需的两个属性:
{{1}}
答案 1 :(得分:7)
正如@Eugen建议的那样,您可以使CardView
内的布局可以点击,这样您就可以使用android:background
:
<android.support.v7.widget.CardView
...
android:clickable="true"
android:background="?attr/selectableItemBackground">
如果您不希望通过点击CardView
内的布局来丢失项目点击监听器,则可以使用android:foreground
:
<android.support.v7.widget.CardView
...
android:clickable="true"
android:foreground="?attr/selectableItemBackground">
额外:如果您不想要矩形蒙版,则可以使用"?attr/selectableItemBackgroundBorderless"
代替"?attr/selectableItemBackground"
。
答案 2 :(得分:1)
创建选择器“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>
并创建“drawable / card_foreground.xml”( 您需要根据卡片的高度调整插入值 )
<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"/>
修改你的项目(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>
您可以查看原始帖子here
答案 3 :(得分:1)
添加foreground
属性:
android:foreground="?android:attr/selectableItemBackground"
答案 4 :(得分:1)
两种方法都应该以同样的方式运作。
1) 如果您希望cardview响应触摸反馈,请在 cardview 中使用此功能。
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
但如果上述方法无效,则可以在 cardview 的 子 视图组(线性/相对等)中设置此属性。
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
但ViewHolder的itemView
将无法响应 触摸 事件。由于子视图已经 消费 ,因此您必须在子视图上设置 clicklistener 以进一步处理侦听器recyclerview适配器,通过这种方式,我们可以在适配器中的recyclerview行项目上启用触摸和点击事件。
如果您很难按下触摸并点击带有纹波的cardview中的视图,那么这可能会有所帮助。 Touch Feedback Problem
2。) 第二种方法是使用传统方式使用自定义触摸选择器drawable并设置为背景。
<?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>