CardView在Pre-Lollipop的每个边缘都有额外的边距

Jad*_* Gu 25 android android-cardview android-5.0-lollipop

这是两张照片.

在棒棒糖上: 在棒棒糖上:

在预棒棒糖上: 在前棒棒糖

我们可以看到它就在Lollipop的屏幕旁边.这就是我想要的.但在Pre-Lollipop设备上,屏幕边缘有额外的余量.你们有经验吗?谢谢.

这是布局xml:

<android.support.v7.widget.CardView
        android:id="@+id/card_title_schedule"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        app:cardCornerRadius="0dp"
        app:cardBackgroundColor="@color/colorAccent"
        >
Run Code Online (Sandbox Code Playgroud)

sud*_*007 23

因此,在Kitkat,三星设备上完全没问题.

我试过card_view:cardUseCompatPadding="true"但没有用.没工作!

然后我从stackoverflow帖子中发现了这个 card_view:cardPreventCornerOverlap="false"和VOILA!成功了!没有圆角(因为卡片有图像背景,所以我不想要).

道德是,额外的填充是因为那些需要被禁用的小圆角.基本上这不是缺陷而是设计约束!

原始SOF回复

图像:请注意,顶角是边缘(有背景的颜色和图像的视图),而底部只有TextViews,因此没有背景,圆角.这意味着如果视图match_parent在CardView内部请求,card_view:cardPreventCornerOverlap="false"则允许在受影响的角落处进行查看.

在此输入图像描述


小智 18

在L之前,CardView会在其内容中添加填充并为该区域绘制阴影.此填充量等于两侧的maxCardElevation +(1 - cos45)*cornerRadius,顶部和底部的maxCardElevation*1.5 +(1 - cos45)*cornerRadius.

这里的CardView参考

尝试在CardView此上设置负左边距

<android.support.v7.widget.CardView
        android:id="@+id/card_title_schedule"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        app:cardCornerRadius="0dp"
        app:cardBackgroundColor="@color/colorAccent" 
        app:cardUseCompatPadding="true"
        android:layout_marginLeft="-2dp" />
Run Code Online (Sandbox Code Playgroud)

您可能需要调整边距以获得所需的结果.

PS,这是一种hack-y方式.


小智 14

我意识到这已经得到了回答,但我想补充说,除此之外card_view:cardPreventCornerOverlap="false",我还必须设置CardView.setMaxCardElevation(0)摆脱前Lollipop的边缘.仅将高程设置为0不起作用.我正在使用支持库v23.4.0.

  • 感谢**"setMaxCardElevation"**指针.在我的情况下摆脱所有边缘的"额外"填充_(即使在CardView或其子节点上没有角半径)_我必须设置这3(在xml中):`app:cardMaxElevation ="0dp"app :cardElevation ="0dp"app:cardPreventCornerOverlap ="false"`...使用**com.android.support:cardview-v7:25.2.0** (6认同)

San*_*ela 13

试试吧 card_view:cardUseCompatPadding="true"

如果我们将此属性设置为true,则margin在所有版本上都相同.

开发者注意

在API v21 +中添加填充以与先前版本具有相同的度量.

文档


Ima*_*ari 5

如果需要Android 4(棒棒糖之前)的行为,则添加app:cardUseCompatPadding="true"到中即可CardView解决该问题。

如果需要Android 5+的行为(根据材料指南,这实际上是名片视图的正确行为),那么就很难轻易实现完全相同的事情。我通常使用此修复程序来避免定义多个布局文件,并在所有设备上具有合理的输出:

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:contentPaddingRight="@dimen/fix_cardview"
    app:contentPaddingLeft="@dimen/fix_cardview"
    app:contentPaddingTop="@dimen/fix_cardview_vertical"
    app:contentPaddingBottom="@dimen/fix_cardview_vertical" />
Run Code Online (Sandbox Code Playgroud)

在普通values/dimens.xml文件中,我们应该具有:

<dimen name="fix_cardview">-8dp</dimen>
<dimen name="fix_cardview_vertical">-12dp</dimen>
Run Code Online (Sandbox Code Playgroud)

并在values-v21/dimens.xml

<dimen name="fix_cardview">0dp</dimen>
<dimen name="fix_cardview_vertical">0dp</dimen>
Run Code Online (Sandbox Code Playgroud)

请注意,数字-8dp-12dp可能必须根据您的布局进行调整,因为它们取决于高程等。

这只是一种避免在Android 4视图中使用丑陋填充的解决方法,而无需在不同布局文件中使用不同视图(这通常会使代码更难维护)