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

时间:2015-03-16 01:43:49

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

这是两张照片。

棒棒糖上的

on Lollipop:

预备棒棒糖上的

on Pre-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"
        >

7 个答案:

答案 0 :(得分:22)

所以在这里,它非常适合Kitkat,三星设备。

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

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

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

ORIGINAL SOF REPLY

图片:请注意,顶角是边缘(有背景的颜色和图像的视图),而底部只有TextViews,因此没有背景,圆角。这意味着,如果视图在CardView中请求match_parentcard_view:cardPreventCornerOverlap="false"将允许在受影响的角落接收该视图。

enter image description here

答案 1 :(得分:16)

  

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

来自CardView参考here

尝试在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" />

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

PS,这是一种黑客行事方式。

答案 2 :(得分:14)

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

答案 3 :(得分:13)

尝试使用card_view:cardUseCompatPadding="true"

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

开发者备注

  

在API v21 +中添加填充也可以使用相同的测量值   以前的版本。

来源docs

答案 4 :(得分:4)

解决&#34;阴影空间&#34;对于PRE-L版本的问题,您可以通过负值动态更新CardView边距以补偿空间。

获取实际的影子空间:

.insert(0, ...)

修复保证金:

shadowSpaceLeft = getPaddingLeft() - getContentPaddingLeft();

这适用于所有Android版本,因为我们动态获取填充值和contentPadding值。

例如,每当我们设置新的布局参数时,这是一个类:

layoutParams.leftMargin -= shadowSpaceLeft;

答案 5 :(得分:4)

如果需要Android 4(pre-lollipop)行为,将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" />

在正常values/dimens.xml文件中我们应该:

<dimen name="fix_cardview">-8dp</dimen>
<dimen name="fix_cardview_vertical">-12dp</dimen>

values-v21/dimens.xml

<dimen name="fix_cardview">0dp</dimen>
<dimen name="fix_cardview_vertical">0dp</dimen>

请注意,可能需要针对您的布局调整数字-8dp-12dp,因为它们取决于高程等。

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

答案 6 :(得分:0)

只需在您的棒棒糖之前版本中添加以下代码即可:

{
    "1": "A sample string",
    "2": 1234,
    "AnEmptyObject": {},
    "AnEmptyArray": []
}