Đặt Elevation trong XML trên AppCompat CardView trên Android 5.0


95

Theo những gì tôi hiểu, ban đầu trong giai đoạn xem trước dường như không có cách nào để chỉ đặt độ cao trong XML trên CardViews mà không bị hack trong Java. Bây giờ bản phát hành chính thức đã ra mắt, có cách nào thực hiện điều này trong XML mà không cần viết mã Java để đặt độ cao không?

Tôi đã cố gắng card_view:cardElevationnhưng không có tác dụng. Tôi đã nghĩ khi tôi sử dụng trình giả lập cho 5.0 thì mọi thứ đều ổn. Nhưng bây giờ tôi đang sử dụng phiên bản chính thức trên thiết bị thực tế của mình, tất cả các thiết bị của tôi CardViewđã biến mất

Pre Lollipop, nó hoạt động rất tốt.

Đây là xml đầy đủ của tôi

<?xml version="1.0" encoding="utf-8"?>
<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:orientation="horizontal"
    android:layout_width="match_parent"
    android:id="@+id/cv1"
    card_view:cardElevation="4dp"
    android:layout_margin="6dp"
    card_view:cardCornerRadius="3dp"
    android:layout_height="match_parent">

Tôi đã hiểu được vấn đề nhưng chưa có câu trả lời. Khi tôi nâng cấp lên lollipop, bằng cách nào đó các lề hoặc phần đệm đã biến mất nên chúng không nhìn thấy các góc hoặc các cạnh của thẻ để nó hoàn toàn phẳng.
TheLet MobileMaster

Câu trả lời:


316

Có vẻ như vấn đề về lề / đệm, hãy thử đặt thuộc tính cardUseCompatPadding thành true. Ví dụ:

<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="match_parent"
    android:layout_margin="6dp"
    card_view:cardUseCompatPadding="true"
    card_view:cardElevation="4dp"
    card_view:cardCornerRadius="3dp">

Giải thích từ tài liệu Android:

CardView thêm phần đệm bổ sung để vẽ bóng trên các nền tảng trước L.

Điều này có thể khiến Thẻ có các kích thước khác nhau giữa L và trước L. Nếu bạn cần căn chỉnh CardView với các Chế độ xem khác, bạn có thể cần tài nguyên thứ nguyên cụ thể của phiên bản api để giải thích cho các thay đổi. Thay vào đó, bạn có thể đặt cờ cardUseCompatPadding thành true và CardView sẽ thêm các giá trị đệm giống nhau trên các nền tảng L trở lên.

Vì việc đặt cờ cardUseCompatPadding thành true sẽ thêm các khoảng trống không cần thiết trong giao diện người dùng, nên giá trị mặc định là false.


1
card_view: cardUseCompatPadding = "true" có độ cao để hoạt động nhưng cũng thêm một loạt đệm ....
Taylor

1
giá trị mặc định của thẻElevation là gì?
nhà phát triển android

13

Nếu bạn có dòng này

android:hardwareAccelerated="false"

trong thẻ ứng dụng kê khai bóng của bạn không được hiển thị. cố gắng xóa dòng này

hoặc dùng

android:hardwareAccelerated="true"

Điều này đã làm việc cho tôi! Hy vọng nó cũng làm việc cho bạn :)


vâng! đó là vấn đề !! cảm ơn bạn rất nhiều! nhưng không phải do hình ảnh bitmap mà tôi đã sử dụng làm nền, ứng dụng bị chậm lại :(
Kaushal28

13

Bạn phải sử dụng cardElevationthuộc tính.
Thư viện Androidx:

Bạn có thể sử dụng MaterialCardbao gồm trong thư viện Thành phần Vật liệu chính thức :

implementation 'com.google.android.material:material:1.x.x'

Và trong bố cục của bạn:

    <com.google.android.material.card.MaterialCardView
        app:cardElevation="xxdp"
        app:cardUseCompatPadding="true"
        ..>

Hoặc CardViewtrong các gói androidx:

implementation 'androidx.cardview:cardview:1.x.x'

Và trong bố cục của bạn:

     <androidx.cardview.widget.CardView
        app:cardElevation="xxdp"
        app:cardUseCompatPadding="true"
        ..>

Thư viện hỗ trợ CŨ :

<android.support.v7.widget.CardView
    app:cardElevation="xxdp" 
    app:cardUseCompatPadding="true"
    ..>

1
Không, tôi đã thử lại, và điều đó không hiệu quả. Tôi đã thêm xml đầy đủ của mình lên trên.
TheLet MobileMaster

Làm việc cho tôi. Độ cao mặc định là gì?
SMBiggs

Độ cao khi nghỉ của thẻ: 2dp Độ cao nâng của thẻ: 8dp Các thẻ có độ cao mặc định là 2dp. Trên máy tính để bàn, thẻ có thể có độ cao khi nghỉ là 0dp và đạt độ cao 8dp khi di chuột. Từ google.com/design/spec/components/…
ZimaXXX

nó không được dùng nữa
Makarand

1
@Makarand True Thư viện thiết kế không còn được duy trì nhưng tôi đã trả lời câu hỏi này cách đây 5 năm. Trong mọi trường hợp, tôi đã cập nhật câu trả lời với chi tiết andriodx.
Gabriele Mariotti

1

Nó đã giải quyết cho tôi bằng cách thêm

xmlns: card_view = "http://schemas.android.com/apk/res-auto"

ví dụ:

<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="wrap_content"
    android:layout_marginTop="5dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    card_view:cardCornerRadius="5dp">

0

tôi đang thêm thuộc tính app: cardElevation = "8dp" trên chế độ xem thẻ, vì vậy nó sẽ giống như sau:

<android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="160dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:cardElevation="8dp"
        app:cardCornerRadius="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="centerCrop"
            android:src="@drawable/kmp_warna1" />

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

Hy vọng nó sẽ giúp ích

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.