在具有 Android 5.0 设备的 CardView 上,没有以 selectableItemBackground 作为前景显示涟漪

Posted

技术标签:

【中文标题】在具有 Android 5.0 设备的 CardView 上,没有以 selectableItemBackground 作为前景显示涟漪【英文标题】:Ripples not showing with selectableItemBackground as foreground on a CardView with a Android 5.0 device 【发布时间】:2015-02-12 23:20:31 【问题描述】:

我在 Nexus 5 上运行它。这是我的 CardView 的部分代码:

        CardView cardView = new CardView(getActivity());
        cardView.setRadius(4);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 400);
        lp.setMargins(32, 16, 32, 16);
        cardView.setLayoutParams(lp);
        cardView.setContentPadding(50, 50, 50, 50);
        ...
        cardView.setForeground(selectedItemDrawable);

这是我获得 selectedItemDrawable 的方法:

        int[] attrs = new int[]  R.attr.selectableItemBackground ;
        TypedArray ta = getActivity().obtainStyledAttributes(attrs);
        selectedItemDrawable = ta.getDrawable(0);
        ta.recycle();

当我点击卡片时,不出现应该与 selectedItemDrawable 一起出现的波纹(它看起来与没有设置前景完全相同)。我正在运行 5.0,所以这看起来很奇怪,因为 appcompat 文档只说它不适用于棒棒糖之前的设备。有谁知道为什么会这样?最低 API 级别为 16,目标为 21。

【问题讨论】:

您确定,您在cardview 中没有任何设置为match_parent 并且有自己背景的视图吗? 我已经注释掉了任何向 CardView 添加视图的代码,这样布局中就只有 CardView 了,结果是一样的。将其设置为具有 CardView 中这些属性的 LinearLayout 的背景也无济于事。 确实,在xml中用android:foreground="?android:attr/selectableItemBackground"定义CardView时,仍然没有涟漪效应。 我可以使用 XML 创建波纹:android:clickable="true" 和 selectableItemBackground 前景,但我似乎无法在代码中重新创建它... 【参考方案1】:

事实证明,我正在与多个卡片视图共享我的 Drawable 实例。这通过使用 getSelectedItemDrawable 方法返回一个新实例来解决:

    public Drawable getSelectedItemDrawable() 
        int[] attrs = new int[]R.attr.selectableItemBackground;
        TypedArray ta = getActivity().obtainStyledAttributes(attrs);
        Drawable selectedItemDrawable = ta.getDrawable(0);
        ta.recycle();
        return selectedItemDrawable;
    

然后以编程方式将其设置为前台:

        cardView.setForeground(getSelectedItemDrawable());
        cardView.setClickable(true);

现在我在 5.0 上得到了连锁反应。

【讨论】:

已确认,setForeground() 仅适用于 API 23+ - Android 文档错误地将其列为 API 级别 1。此处为 AOSP 错误报告 - code.google.com/p/android/issues/detail?id=186273。 这对我不起作用。我尝试将其直接放在图像视图以及包含图像视图的框架布局上。都没有用。 你还必须在你的 cardView 上添加 android:clickable="true"

以上是关于在具有 Android 5.0 设备的 CardView 上,没有以 selectableItemBackground 作为前景显示涟漪的主要内容,如果未能解决你的问题,请参考以下文章

原创Android 5.0 BLE低功耗蓝牙从设备应用

PubNub GCM通知无法在Android 5.0及更高版本上运行

Android BLE write Characteristic 方法在 Android 5.0 及更高版本中总是返回 false

5.0Android Studio调试你的应用

5.0Android Studio调试你的应用

在 Android 5.0 Lollipop 上不支持 calendarViewShown