การตั้งค่าระดับความสูงใน XML บน AppCompat CardView บน Android 5.0


95

จากสิ่งที่ฉันเข้าใจในช่วงแรกของขั้นตอนการแสดงตัวอย่างดูเหมือนจะไม่มีวิธีตั้งค่าระดับความสูงใน XML เฉพาะบนCardViews โดยไม่ต้องแฮ็กใน Java ตอนนี้มีการเผยแพร่อย่างเป็นทางการแล้วมีวิธีใดบ้างในการทำสิ่งนี้ใน XML โดยไม่ต้องเขียนโค้ด Java เพื่อตั้งค่าความสูง

ฉันพยายามแล้วcard_view:cardElevationไม่มีผล ฉันเคยคิดว่าเมื่อฉันใช้อีมูเลเตอร์สำหรับ 5.0 ทุกอย่างเรียบร้อยดี แต่ตอนนี้ฉันใช้เวอร์ชันอย่างเป็นทางการบนอุปกรณ์จริงของฉันทั้งหมดCardViewหายไป

พรีอมยิ้มมันใช้งานได้ดี

นี่คือ xml แบบเต็มของฉัน

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

ฉันได้รับเบื้องหลังปัญหา แต่ยังไม่มีคำตอบ เมื่อฉันอัปเกรดเป็นอมยิ้มระยะขอบหรือช่องว่างภายในหายไปดังนั้นจึงไม่เห็นมุมหรือขอบของการ์ดจึงแบนสนิท
TheLettuceMaster

คำตอบ:


317

ดูเหมือนปัญหาระยะขอบ / ช่องว่างให้ลองตั้งค่าแอตทริบิวต์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="match_parent"
    android:layout_margin="6dp"
    card_view:cardUseCompatPadding="true"
    card_view:cardElevation="4dp"
    card_view:cardCornerRadius="3dp">

คำอธิบายจาก Android doc:

CardView เพิ่มช่องว่างภายในเพิ่มเติมเพื่อวาดเงาบนแพลตฟอร์มก่อน L

ซึ่งอาจทำให้การ์ดมีขนาดแตกต่างกันระหว่าง L และก่อน L หากคุณต้องการจัดแนว CardView ให้ตรงกับมุมมองอื่น ๆ คุณอาจต้องใช้ทรัพยากรมิติข้อมูลเฉพาะเวอร์ชัน API เพื่อพิจารณาการเปลี่ยนแปลง คุณสามารถตั้งค่าแฟล็ก cardUseCompatPadding เป็น true และ CardView จะเพิ่มค่าช่องว่างเดียวกันบนแพลตฟอร์ม L และหลัง

เนื่องจากการตั้งค่าแฟล็ก cardUseCompatPadding เป็น true จะเพิ่มช่องว่างที่ไม่จำเป็นใน UI ค่าเริ่มต้นจึงเป็นเท็จ


1
card_view: cardUseCompatPadding = "true" ได้รับการยกระดับในการทำงาน แต่เพิ่มช่องว่างภายในด้วย ....
Taylor

1
ค่าเริ่มต้นของ cardElevation คืออะไร?
นักพัฒนา Android

13

หากคุณมีสายนี้

android:hardwareAccelerated="false"

ในรายการแอปพลิเคชันแท็กเงาของคุณไม่ปรากฏ ลองลบบรรทัดนี้

หรือใช้

android:hardwareAccelerated="true"

สิ่งนี้ได้ผลสำหรับฉัน! ฉันหวังว่ามันจะเหมาะกับคุณเช่นกัน :)


ใช่! นั่นคือปัญหา !! ขอบคุณมาก! แต่ไม่ใช่เนื่องจากภาพบิตแมปที่ฉันใช้เป็นพื้นหลังแอปจึงช้าลง :(
Kaushal28

13

คุณต้องใช้cardElevationแอตทริบิวต์
ไลบรารี Androidx:

คุณสามารถใช้สิ่งที่MaterialCardรวมอยู่ในไลบรารีส่วนประกอบวัสดุอย่างเป็นทางการ:

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

และในเค้าโครงของคุณ:

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

หรือCardViewในแพ็คเกจ androidx:

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

และในเค้าโครงของคุณ:

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

ไลบรารีการสนับสนุนเก่า :

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

1
ไม่ฉันลองอีกครั้ง แต่ก็ไม่ได้ผล ฉันเพิ่ม xml แบบเต็มขึ้นด้านบน
TheLettuceMaster

เหมาะสำหรับฉัน ระดับความสูงเริ่มต้นคืออะไร?
SMBiggs

บัตรยกระดับความสูง: การ์ด 2dp ยกระดับความสูง: การ์ด 8dp มีระดับความสูงเริ่มต้นที่ 2dp บนเดสก์ท็อปการ์ดสามารถมีระดับความสูงอยู่ที่ 0dp และได้รับความสูง 8dp เมื่อวางเมาส์เหนือ จากgoogle.com/design/spec/components/…
ZimaXXX

เลิกใช้งานแล้ว
Makarand

1
@Makarand True ห้องสมุดการออกแบบไม่ได้รับการดูแลอีกต่อไป แต่ฉันตอบคำถามนี้เมื่อ 5 ปีที่แล้ว ไม่ว่าในกรณีใดฉันได้อัปเดตคำตอบพร้อมรายละเอียด andriodx แล้ว
Gabriele Mariotti

1

มันแก้ไขฉันด้วยการเพิ่ม

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

ตัวอย่างเช่น:

<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

ฉันกำลังเพิ่มแอป: cardElevation = แอตทริบิวต์ "8dp" ในมุมมองการ์ดดังนั้นมันจะเป็นดังนี้:

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

หวังว่ามันจะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.