CardView가 Android L에서 Shadow를 표시하지 않음


123

Listview 내의 내 Cardview가 Android L (Nexus 5)에서 그림자를 표시하지 않습니다. 또한 둥근 모서리가 제대로 표시되지 않습니다. 다음은 Listview의 Adapter View 코드입니다.

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@android:color/white"
    android:foreground="?android:attr/selectableItemBackground"
    app:cardCornerRadius="4dp"
    app:cardElevation="4dp" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingTop="@dimen/activity_vertical_margin" >

        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginTop="@dimen/padding_small"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <ImageView
            android:id="@+id/ivPicture"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tvName"
            android:layout_centerHorizontal="true"
            android:scaleType="fitCenter" />

        <TextView
            android:id="@+id/tvDetail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/ivPicture"
            android:layout_centerHorizontal="true"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin" />
    </RelativeLayout>
</android.support.v7.widget.CardView>

그리고 ListView xml :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/app_bg" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:cacheColorHint="#00000000"
    android:divider="@android:color/transparent"
    android:drawSelectorOnTop="true"
    android:smoothScrollbar="true" />

<ProgressBar
    android:id="@+id/progressBarMain"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="gone" /></RelativeLayout>

적절한 그림자와 둥근 모서리가있는 pre-L 장치에서 잘 작동합니다. 하지만 Android L 기기에서는 작동하지 않습니다. 내가 여기서 무엇을 놓치고 있는지 말할 수 있습니까?



@AIL 그러나 나는 cardview 또는 그 부모 뷰에 대해 투명한 배경을 사용하지 않고 있습니다
isumit dec

@isumit 네, 여기에도 같은 문제가 있습니다.
greywolf82

아직 해결책을 찾지 못한 경우 @ greywolf82. 나는 cardview에 여백을 추가했고 이제 Lollipop에서 그림자를 표시합니다
isumit

답변:


279

문서를 다시 살펴본 후 마침내 해결책을 찾았습니다.

추가 card_view:cardUseCompatPadding="true"하면 CardViewLollipop 장치에 그림자가 나타납니다.

무슨 일이 벌어지는 지, CardView롤리팝과 롤리팝 기기 에서 콘텐츠 영역의 크기가 달라집니다. 따라서 롤리팝 장치에서 그림자는 실제로 카드로 가려져 보이지 않습니다. 이 속성을 추가하면 콘텐츠 영역이 모든 장치에서 동일하게 유지되고 그림자가 표시됩니다.

내 XML 코드는 다음과 같습니다.

<android.support.v7.widget.CardView
    android:id="@+id/media_card_view"
    android:layout_width="match_parent"
    android:layout_height="130dp"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardElevation="2dp"
    card_view:cardUseCompatPadding="true"
    >
...
</android.support.v7.widget.CardView>

알렉스 - 록우드 @ 당신은, 즉, 변경 사항을 설명하시기 바랍니다 수 card_view:cardElevation="2sp"card_view:cardElevation="2dp"?
Ram Patra

1
@Ramswaroop sp은 텍스트 크기에만 사용해야합니다. dp다른 모든 차원에는 사용되어야합니다.
Alex Lockwood

내 경우 card_view : cardUseCompatPadding이 필요했습니다. 또한 targetSdkVersion을 21로 변경해야합니다. 여백을 변경해도 효과가 없습니다.
레미

@ KishanSolanki124 OP (@isumit)가이 스레드를 잃어버린 것 같습니다.
Ram Patra

55

당신이 사용해야 그림자 그리는 것을 잊지 마세요 hardwareAccelerated도면을

hardwareAccelerated = true

여기에 이미지 설명 입력

hardwareAccelerated = false

하드웨어 가속 CardView

자세한 내용은 Android 하드웨어 가속 을 참조하십시오.


10
타겟 API 레벨이> = 14이면 하드웨어 가속이 기본적으로 활성화됩니다!
Aksel Fatih

2
작동 중입니다. 하지만이 뒤에 이유를 이해하지 않습니다
디팍 쿠마

54

app:cardUseCompatPadding="true"카드 뷰 내부에서 사용 하세요. 예를 들어

<android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginRight="@dimen/cardviewMarginRight"
        app:cardBackgroundColor="@color/menudetailsbgcolor"
        app:cardCornerRadius="@dimen/cardCornerRadius"
        app:cardUseCompatPadding="true"
        app:elevation="0dp">
    </android.support.v7.widget.CardView>

28

확인 hardwareAccelerated를 매니페스트는 사실 확인에 거짓 그림자 전화의 XML 미리보기에 표시하지만,하지 않을 경우, 그것은 거짓 제거합니다 그림자 만들기.


24

이 줄을 CardView에 추가합니다 ....

card_view:cardUseCompatPadding="true" //for enable shadow
card_view:cardElevation="9dp" // this for how much shadow you want to show

shadow_marginTop 및 layout_marginBottom은 그림자 자체가 위아래로 약간의 공간을 차지하므로이를 피할 수 있습니다. card_view : cardElevation = "ndp"에서 사용할 양에 따라 정의되는 공간입니다.

해피 코딩 (:


22

마지막으로 카드 뷰에 여백을 추가하여 Lollipop 장치에서 그림자를 얻을 수있었습니다. 최종 카드 뷰 레이아웃은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@android:color/white"
    android:foreground="?android:attr/selectableItemBackground"
    android:layout_marginLeft="@dimen/activity_horizontal_margin"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:layout_marginTop="@dimen/padding_small"
    android:layout_marginBottom="@dimen/padding_small"
    app:cardCornerRadius="4dp"
    app:cardElevation="4dp" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="@dimen/padding_small"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <ImageView
        android:id="@+id/ivPicture"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvName"
        android:layout_centerHorizontal="true"
        android:scaleType="fitCenter" />

    <TextView
        android:id="@+id/tvDetail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/ivPicture"
        android:layout_centerHorizontal="true"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin" />
</RelativeLayout>


2
이미 card_view : cardUseCompatPadding 값을 설정했지만 여전히 shaddows를 가져올 수 없었습니다. 내가 놓친 것은 여백입니다. 그리고 정말 효과가있었습니다. 감사.
Ajith Memana

마진 가치는 얼마입니까? 이다 8dp충분?
behelit

13

다음 태그를 추가하기 만하면됩니다.

app:cardElevation="2dp"
app:cardUseCompatPadding="true"

따라서 다음과 같이됩니다.

<android.support.v7.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="?colorPrimary"
    app:cardCornerRadius="3dp"
    app:cardElevation="2dp"
    app:cardUseCompatPadding="true"
    app:contentPadding="1dp" />

12

카드보기의 그림자에이 코드 줄을 추가 할 수 있습니다.

card_view:cardElevation="3dp"

아래에 예가 있습니다.

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@android:color/white"
    android:foreground="?android:attr/selectableItemBackground"
    card_view:cardElevation="3dp"
    card_view:cardCornerRadius="4dp">

도움이 되었기를 바랍니다!


감사합니다. 키는 android : cardElevation이 아니라 card_view : cardElevation이었습니다.
Badr

8

이 줄을 추가하여 시도 할 수 있습니다.

 card_view:cardUseCompatPadding="true"

전체 코드는 다음과 같습니다.

  <android.support.v7.widget.CardView 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_margin="5dp"
        android:orientation="horizontal"
        card_view:cardUseCompatPadding="true"
        card_view:cardCornerRadius="5dp">
 </android.support.v7.widget.CardView

7

제 경우에는 여백을 추가하지 않았기 때문에 Android L 장치에 그림자가 표시되지 않았습니다. 문제는 CardView가 <5 개 장치에서이 여백을 자동으로 생성하므로 이제 다음과 같이합니다.

CardView card = new CardView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
if (Build.VERSION_CODES.LOLLIPOP == Build.VERSION.SDK_INT) {
    params.setMargins(shadowSize, shadowSize, shadowSize,
            shadowSize);
} else {
    card.setMaxCardElevation(shadowSize);
}
card.setCardElevation(shadowSize);
card.setLayoutParams(params);

레이아웃 파일에서 카드 뷰에 여백 추가가 작동합니다. 코드에서 시도하지 않았 음
isumit

6

아래와 같이 매니페스트 파일에 android : hardwareAccelerated = "true"를 추가하십시오.

 <activity
        android:name=".activity.MyCardViewActivity"
        android:hardwareAccelerated="true"></activity>

4

우선 다음 종속성이 build.gradle 파일에 적절하게 추가되고 컴파일되었는지 확인하십시오.

    dependencies {
    ...
    compile 'com.android.support:cardview-v7:21.0.+'

    }

이 후 다음 코드를 시도하십시오.

     <android.support.v7.widget.CardView 
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:card_view="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_margin="5dp"
            android:orientation="horizontal"
            card_view:cardCornerRadius="5dp">
     </android.support.v7.widget.CardView

layout_margin 속성이 추가되지 않았기 때문에 Android L에서 문제가 발생합니다.


0

내 recyclerview가 로딩 속도가 느려서 stackoverflow.com을 읽음으로써 hardwareAccelerated를 "false"로 변경 한 다음 고도가 장치에 표시되지 않습니다. 나는 다시 진실로 바뀌었다. 그것은 나를 위해 작동합니다.


0

카드보기의 그림자에 있기 때문에 RelativeLayout카드보기에서 그림자를 표시 할 수 없습니다 . 그림자를 표시하려면 카드보기에 여백을 추가하십시오. 예를 들면 :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="4dp"
    android:layout_marginBottom="8dp">

</android.support.v7.widget.CardView>

</RelativeLayout>

0

나는 당신이 쓴 경우 매니페스트 첫 번째를 선택하면 생각 android:hardwareAccelerated="false" 당신이 그것을해야 true이 대답처럼 카드에 그림자를 데 여기


0

RecyclerViewandroid:layerType="software" 에서 사용하고 있지 않은지 확인하십시오 .

android:layerType="hardware"나를 위해 문제 를 해결하도록 변경했습니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.