Android Lollipop CardView上的涟漪效应

时间:2014-11-15 04:10:09

标签: android android-layout android-5.0-lollipop android-cardview

我试图通过在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开发比较陌生,所以我可能会犯一些明显的错误 提前谢谢。

13 个答案:

答案 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)

android 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)
        }
    }