CardView không hiển thị Shadow trong Android L


123

Chế độ xem thẻ của tôi bên trong Listview không hiển thị bóng trong Android L (Nexus 5). Ngoài ra các cạnh tròn không được thể hiện đúng. Đây là mã cho Chế độ xem bộ điều hợp của Listview:

<?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>

Và xml ListView:

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

Nó hoạt động tốt trên các thiết bị trước L với bóng tối và các góc tròn phù hợp. Nhưng không hoạt động trên thiết bị Android L. Bạn có thể cho biết những gì tôi đang thiếu ở đây?



@AIL Nhưng tôi không sử dụng bất kỳ nền trong suốt cho cardview hoặc bất kỳ quan điểm mẹ của nó
isumit

@isumit Đúng, vấn đề tương tự ở đây.
greywolf82

@ greywolf82 trong trường hợp bạn vẫn chưa tìm ra giải pháp. Tôi đã thêm lợi nhuận vào cardview và nó hiện đang hiển thị bóng trong Lollipop
isumit

Câu trả lời:


279

Sau khi xem qua các tài liệu một lần nữa, cuối cùng tôi đã tìm ra giải pháp.

Chỉ cần thêm card_view:cardUseCompatPadding="true"vào của bạn CardViewvà bóng sẽ xuất hiện trên thiết bị Lollipop.

Điều gì sẽ xảy ra là, vùng nội dung CardViewcó kích thước khác nhau trên các thiết bị pre-lollipop và lollipop. Vì vậy, trong các thiết bị kẹo mút, bóng thực sự được che bởi thẻ để không nhìn thấy nó. Bằng cách thêm thuộc tính này, khu vực nội dung vẫn giữ nguyên trên tất cả các thiết bị và bóng tối sẽ hiển thị.

Mã xml của tôi giống như:

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

@ alex-lockwood Bạn có thể vui lòng giải thích thay đổi của bạn tức là, card_view:cardElevation="2sp"sang card_view:cardElevation="2dp"không?
Ram Patra

1
@Ramswaroop spchỉ nên được sử dụng cho kích thước văn bản. dpnên được sử dụng cho tất cả các kích thước khác.
Alex Lockwood

Tôi cần trường hợp của tôi card_view: cardUseCompatPadding. Ngoài ra, tôi cần thay đổi targetSdkVersion thành 21. Việc thay đổi ký quỹ không có hiệu lực.
Remi

@ KishanSolanki124 Tôi nghĩ OP (@isumit) đã mất dấu chủ đề này.
Ram Patra

55

Đừng quên rằng để vẽ bóng, bạn phải sử dụng hardwareAcceleratedbản vẽ

hardwareAccelerated = true

nhập mô tả hình ảnh ở đây

hardwareAccelerated = false

Chế độ xem thẻ tăng tốc

Xem Tăng tốc phần cứng Android để biết chi tiết


10
Tăng tốc phần cứng được bật theo mặc định nếu cấp API mục tiêu của bạn> = 14!
Aksel Fatih

2
Nó đang hoạt động ,. Nhưng tôi không hiểu lý do đằng sau này
Deepak Kumar

54

sử dụng app:cardUseCompatPadding="true"bên trong thẻ xem của bạn. Ví dụ

<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

Kiểm tra phần cứng: Tăng tốc trong tệp kê khai làm cho nó đúng, làm cho nó sai sẽ loại bỏ bóng, khi bóng giả xuất hiện trong bản xem trước xml nhưng không xuất hiện trong điện thoại.


24

Thêm dòng này vào CardView ....

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

Lời khuyên

Bạn có thể tránh layout_marginTop và layout_marginBottom vì bản thân bóng tối sẽ chiếm một số không gian lên và xuống của nó. Dung lượng được xác định bởi số lượng bạn sẽ sử dụng trong card_view: cardElevation = "ndp".

Mã hóa hạnh phúc (:


22

Cuối cùng tôi đã có thể tạo bóng trên thiết bị Lollipop bằng cách thêm lề vào chế độ xem thẻ. Đây là bố cục chế độ xem thẻ cuối cùng:

<?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
Tôi đã đặt các giá trị card_view: cardUseCompatPadding, nhưng vẫn không thể nhận được bóng đổ. Cái tôi còn thiếu là cái này, cái lề. Và nó thực sự hiệu quả. Cảm ơn.
Ajith Memana

giá trị ký quỹ của bạn là bao nhiêu? là 8dpđủ?
behelit

13

Chỉ cần thêm các thẻ này:

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

Vì vậy, nó trở thành:

<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

Bạn có thể thêm dòng mã này cho bóng trong chế độ xem thẻ

card_view:cardElevation="3dp"

Dưới đây bạn có một ví dụ

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

Hi vọng điêu nay co ich!


cảm ơn bạn, chìa khóa là card_view: cardElevation chứ không phải android: cardElevation
Badr

8

Bạn có thể thử bằng cách thêm dòng này

 card_view:cardUseCompatPadding="true"

Toàn bộ mã sẽ giống như thế này

  <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

Trong trường hợp của tôi, bóng không hiển thị trên thiết bị Android L vì tôi không thêm lề. Vấn đề là CardView tạo lợi nhuận này tự động trên <5 thiết bị nên bây giờ tôi làm như thế này:

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);

thêm lề vào cardview từ tệp bố cục hoạt động. Không cố gắng từ mã
isumit

6

Thêm android: hardwareAccelerated = "true" vào tệp kê khai của bạn như bên dưới, nó phù hợp với tôi

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

4

Trước hết, hãy đảm bảo rằng các phần phụ thuộc sau được thêm và biên dịch thích hợp trong tệp build.gradle

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

    }

và sau đó, hãy thử mã sau:

     <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

vấn đề phát sinh trong Android L beacuse layout_margin thuộc tính không được thêm vào


0

Chế độ xem tái chế của tôi tải chậm nên khi đọc stackoverflow.com, tôi đã thay đổi phần cứngAccelerated thành "false" thì độ cao không hiển thị trong thiết bị. Tôi đã thay đổi trở lại đúng. Nó làm việc cho tôi.


0

Chế độ xem thẻ không thể hiển thị bóng do của bạn RelativeLayoutnằm trên bóng của chế độ xem thẻ. Để hiển thị bóng đổ, hãy thêm lề trên Chế độ xem thẻ của bạn. Ví dụ:

<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

Tôi nghĩ rằng nếu bạn kiểm tra tệp kê khai của mình trước nếu bạn đã viết, android:hardwareAccelerated="false" bạn nên làm cho nó truecó bóng cho thẻ Giống như câu trả lời này ở đây


0

Kiểm tra xem bạn không sử dụng android:layerType="software"trong RecyclerView của mình .

Thay đổi nó để android:layerType="hardware"giải quyết vấn đề cho tôi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.