我试图通过在Android开发者页面上的here中设置活动XML文件中的android:backgound属性来获取CardView以显示触摸效果,但它无法正常工作。根本没有动画,但是调用onClick中的方法。我也尝试按照建议here创建一个ripple.xml文件,但结果相同。
CardView出现在活动的XML文件中:
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="155dp"
android:layout_height="230dp"
android:elevation="4dp"
android:translationZ="5dp"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:onClick="showNotices"
android:background="?android:attr/selectableItemBackground"
android:id="@+id/notices_card"
card_view:cardCornerRadius="2dp">
</android.support.v7.widget.CardView>
我对android开发比较陌生,所以我可能会犯一些明显的错误 提前谢谢。
答案 0 :(得分:472)
您应该将以下内容添加到CardView
:
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
答案 1 :(得分:26)
将这两行代码添加到xml视图中,以便对您的cardView产生连锁反应。
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
答案 2 :(得分:23)
我设法通过以下方式获得了对cardview的连锁反应:
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:clickable="true"
android:foreground="@drawable/custom_bg"/>
对于您在上面的代码中可以看到的custom_bg,您必须为lollipop(在drawable-v21包中)和pre-lollipop(在drawable包中)设备定义xml文件。 对于drawable-v21包中的custom_bg,代码为:
<ripple
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight">
<item
android:id="@android:id/mask"
android:drawable="@android:color/white"/>
</ripple>
对于drawable包中的custom_bg,代码为:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<solid android:color="@color/colorHighlight"></solid>
</shape>
</item>
<item>
<shape>
<solid android:color="@color/navigation_drawer_background"></solid>
</shape>
</item>
</selector>
因此,在棒棒糖前设备上,您将获得稳定的点击效果,在棒棒糖设备上,您将对cardview产生连锁反应。
答案 3 :(得分:14)
appcompat支持库中省略了涟漪效应,这是您正在使用的。如果你想看到涟漪使用Android L版本并在Android L设备上测试它。根据AppCompat v7站点:
&#34;前棒棒糖为什么没有涟漪? 许多允许RippleDrawable顺利运行的是Android 5.0的新RenderThread。为了优化以前版本Android的性能,我们暂时将RippleDrawable排除在外。&#34;
点击此链接here了解详情
答案 4 :(得分:8)
如果您正在使用的应用minSdkVersion
为9级,则可以使用:
android:foreground="?selectableItemBackground"
android:clickable="true"
相反,从第11级开始,您使用:
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
来自文档:
clickable - 定义此视图是否对点击事件做出反应。必须是布尔值,“true”或“false”。
foreground - 定义绘制内容的drawable。这可以用作叠加层。如果重力设置为填充,则前景drawable参与内容的填充。
答案 5 :(得分:4)
对我来说,将CardView
添加到<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:focusable="true"
android:clickable="true"
card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardUseCompatPadding="true">
<LinearLayout
android:id="@+id/card_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="?android:attr/selectableItemBackground"
android:padding="@dimen/card_padding">
</LinearLayout>
</android.support.v7.widget.CardView>
没有用(原因未知:/)
为它添加相同的子布局就可以了。
<强> CODE:强>
public static void skipSSLValidation() {
try {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
/* Create a new array with room for an additional trusted certificate. */
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
} catch (Exception e) {
// pass
}
}
答案 6 :(得分:4)
改为使用Material Cardview,它扩展了Cardview并提供了多个新功能,包括默认的可点击效果:
<com.google.android.material.card.MaterialCardView>
...
</com.google.android.material.card.MaterialCardView>
依赖关系(最多可以使用API 14来支持较旧的设备):
implementation 'com.google.android.material:material:1.0.0'
答案 7 :(得分:2)
Cardview
控件的Ripple 事件:
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
android:layout_marginBottom="4dp"
android:layout_marginTop="4dp" />
答案 8 :(得分:2)
如果像RelativeLayout或LinearLayout这样的根布局包含CardView中所有适配器项的组件,则必须在该根布局中设置背景属性。像:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="122dp"
android:layout_marginBottom="6dp"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
card_view:cardCornerRadius="4dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/touch_bg"/>
</android.support.v7.widget.CardView>
答案 9 :(得分:1)
添加这两个像代码一样工作就像魅力一样,可以用于任何视图,比如Button,Linear Layout或CardView只需把这两行放进去看看魔术......
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
答案 10 :(得分:0)
对于那些寻找解决涟漪效应问题的解决方案的人来说,以下是在我看来,这个解决方案不能用于编程创建的CardView(或者在我的情况下自定义视图,扩展CardView),这些解决方案显示在RecyclerView中。基本上在XML布局文件中以声明方式声明其他答案中提到的XML属性似乎不适用于以编程方式创建的CardView,或者从自定义布局创建的(即使根视图是使用CardView或合并元素) ,所以必须按程序设置它们:
private class MadeUpCardViewHolder extends RecyclerView.ViewHolder {
private MadeUpCardView cardView;
public MadeUpCardViewHolder(View v){
super(v);
this.cardView = (MadeUpCardView)v;
// Declaring in XML Layout doesn't seem to work in RecyclerViews
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = context.obtainStyledAttributes(attrs);
int selectableItemBackground = typedArray.getResourceId(0, 0);
typedArray.recycle();
this.cardView.setForeground(context.getDrawable(selectableItemBackground));
this.cardView.setClickable(true);
}
}
}
对MadeupCardView extends CardView
部分的TypedArray
感谢this answer。{/ p>
答案 11 :(得分:0)
android:foreground="?android:attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
仅使用api 21并使用此不使用此列表行卡视图
答案 12 :(得分:0)
将以下内容添加到您的xml中:
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
并添加到您的适配器(如果您的情况)
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val attrs = intArrayOf(R.attr.selectableItemBackground)
val typedArray = holder.itemView.context.obtainStyledAttributes(attrs)
val selectableItemBackground = typedArray.getResourceId(0, 0)
typedArray.recycle()
holder.itemView.isClickable = true
holder.itemView.isFocusable = true
holder.itemView.foreground = holder.itemView.context.getDrawable(selectableItemBackground)
}
}