これが2枚の写真です。
ロリポップで:
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"
>
したがって、正確にはサムスンのデバイスであるKitKatで完全にうまくいきます。
card_view:cardUseCompatPadding="true"
を試しましたが、役に立ちませんでした。動作しませんでした!
それから、このcard_view:cardPreventCornerOverlap="false"
とVOILAのstackoverflow投稿から発見しました!働いた!丸い角はありませんでした(カードには画像の背景があるため、角はありませんでした)。
教訓は、余分なパディングは無効にする必要がある小さな丸い角のためです。基本的にそれは欠陥ではなく、設計上の制約です!
画像:上部の角はエッジ(背景に色と画像があるビュー)であり、下部にはTextViewのみがあり、背景がないため、丸い角になっていることに注意してください。つまり、ビューがCardView内でmatch_parent
を要求している場合、card_view:cardPreventCornerOverlap="false"
は、影響を受けるコーナーでそれを取り上げることを許可します。
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、これは一種のハック方法です。
これはすでに回答済みであることに気づきましたが、_card_view:cardPreventCornerOverlap="false"
_に加えて、CardView.setMaxCardElevation(0)
を設定して、Lollipop以前のマージンを取り除く必要がありました。標高を0のみに設定しても機能しませんでした。サポートライブラリv23.4.0を使用しています。
card_view:cardUseCompatPadding="true"
このプロパティをtrueに設定すると、マージンはすべてのバージョンで同じように機能します。
開発者メモ
API v21 +にもパディングを追加して、以前のバージョンと同じ測定値を取得します。
ソース ドキュメント
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いパディングを回避するための回避策にすぎません(通常、コードのメンテナンスが難しくなります)
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);
}
}
lollipopの以前のバージョンのコードにこれを追加するだけです。
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop)
{
cardView.setMaxCardElevation(0f);
cardView.setPreventCornerOverlap(false);
}