web-dev-qa-db-ja.com

CardViewには、Pre-Lollipopの各エッジに追加のマージンがあります

これが2枚の写真です。

ロリポップで: on Lollipop:

pre-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"
        >
25
Jaden Gu

したがって、正確にはサムスンのデバイスであるKitKatで完全にうまくいきます。

card_view:cardUseCompatPadding="true"を試しましたが、役に立ちませんでした。動作しませんでした!

それから、このcard_view:cardPreventCornerOverlap="false"とVOILAのstackoverflow投稿から発見しました!働いた!丸い角はありませんでした(カードには画像の背景があるため、角はありませんでした)。

教訓は、余分なパディングは無効にする必要がある小さな丸い角のためです。基本的にそれは欠陥ではなく、設計上の制約です!

元のSOF REPLY

画像:上部の角はエッジ(背景に色と画像があるビュー)であり、下部にはTextViewのみがあり、背景がないため、丸い角になっていることに注意してください。つまり、ビューがCardView内でmatch_parentを要求している場合、card_view:cardPreventCornerOverlap="false"は、影響を受けるコーナーでそれを取り上げることを許可します。

enter image description here

22
sud007

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" />

必要な結果を得るには、マージンを調整する必要がある場合があります。

PS、これは一種のハック方法です。

18
shemarcl

これはすでに回答済みであることに気づきましたが、_card_view:cardPreventCornerOverlap="false"_に加えて、CardView.setMaxCardElevation(0)を設定して、Lollipop以前のマージンを取り除く必要がありました。標高を0のみに設定しても機能しませんでした。サポートライブラリv23.4.0を使用しています。

14
okacat

card_view:cardUseCompatPadding="true"

このプロパティをtrueに設定すると、マージンはすべてのバージョンで同じように機能します。

開発者メモ

API v21 +にもパディングを追加して、以前のバージョンと同じ測定値を取得します。

ソース ドキュメント

13
Sanket Kachhela

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ビューで、異なるレイアウトファイルで異なるビューを使用せずにusuallyいパディングを回避するための回避策にすぎません(通常、コードのメンテナンスが難しくなります)

5
Iman Akbari

PRE-Lバージョンの「シャドウスペース」の問題を解決するには、負の値でCardViewマージンを動的に更新してスペースを補正します。

実際のシャドウスペースを取得するには:

shadowSpaceLeft = getPaddingLeft() - getContentPaddingLeft();

マージンを修正するには:

layoutParams.leftMargin -= shadowSpaceLeft;

これは、パディング値とcontentPadding値を動的に取得しているため、すべてのAndroidバージョンで機能します。

たとえば、新しいレイアウトパラメータを設定するたびにそれを行うクラスを次に示します。

public class NoPaddingCardView extends CardView {

    public NoPaddingCardView(Context context) {
        super(context);
        init();
    }

    public NoPaddingCardView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public NoPaddingCardView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // Optional: Prevent pre-L from adding inner card padding 
        setPreventCornerOverlap(false);
        // Optional: make Lollipop and above add shadow padding to match pre-L padding
        setUseCompatPadding(true);
    }

    @Override
    public void setLayoutParams(ViewGroup.LayoutParams params) {
        // FIX shadow padding
        if (params instanceof MarginLayoutParams) {
            MarginLayoutParams layoutParams = (MarginLayoutParams) params;
            layoutParams.bottomMargin -= (getPaddingBottom() - getContentPaddingBottom());
            layoutParams.leftMargin -= (getPaddingLeft() - getContentPaddingLeft());
            layoutParams.rightMargin -= (getPaddingRight() - getContentPaddingRight());
            layoutParams.topMargin -= (getPaddingTop() - getContentPaddingTop());
        }

        super.setLayoutParams(params);
    }
}
4
Eyal Biran

lollipopの以前のバージョンのコードにこれを追加するだけです。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop)
    {
        cardView.setMaxCardElevation(0f);
        cardView.setPreventCornerOverlap(false);
    }
0
AREF