11

我在 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。

4

1 回答 1

9

事实证明,我正在与多个卡片视图共享我的 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 的连锁反应。

于 2014-12-14T21:59:16.813 回答