Макет Android CardView не работает до API 28

#android #material-design #android-cardview

#Android #материал-дизайн #android-cardview

Вопрос:

У меня есть макет представления, использующий a CardView , который должен выглядеть следующим образом

введите описание изображения здесь

И он отлично смотрится на устройствах под управлением Android 9 и выше (API 28 ). Однако на чем-либо более старом он выглядит сломанным:

введите описание изображения здесь

Макет выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="125dp"
    android:layout_height="40dp"
    android:layout_marginEnd="8dp"
    app:cardCornerRadius="165dp"
    app:cardElevation="8dp"
    app:contentPadding="8dp"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        >

        <android.support.v7.widget.CardView
            android:layout_width="24dp"
            android:layout_height="24dp"
            app:cardCornerRadius="16dp"
            app:cardElevation="0dp"
            >

            <ImageView
                android:id="@ id/tab_icon"
                android:layout_width="26dp"
                android:layout_height="26dp"
                android:layout_gravity="center"
                tools:src="@tools:sample/avatars"
                />

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

        <TextView
            android:id="@ id/tab_title"
            android:layout_width="60dp"
            android:layout_height="match_parent"
            android:layout_marginStart="4dp"
            android:layout_marginEnd="6dp"
            android:ellipsize="end"
            android:gravity="center_vertical"
            android:maxLines="1"
            android:paddingBottom="2dp"
            android:textColor="@android:color/black"
            android:textSize="14sp"
            tools:text="Sample User"
            />

        <ImageView
            android:id="@ id/tab_close"
            android:layout_width="14dp"
            android:layout_height="14dp"
            android:src="@drawable/btn_close"
            />

    </LinearLayout>

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

Я использую 'com.android.support:cardview-v7:28.0.0' зависимость.

Ответ №1:

Похоже, проблема заключалась в значении, установленном для cardCornerRadius . Установив его на 20dp, я получил желаемый радиус границы без нарушения макета.

Ответ №2:

Вы можете использовать SDP — масштабируемую единицу измерения

 dependencies {
  implementation 'com.intuit.sdp:sdp-android:1.0.6'
}
  

К ВАШЕМУ СВЕДЕНИЮ

  <android.support.v7.widget.CardView 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="125dp"
  android:layout_height="40dp"
  android:layout_marginEnd="8dp"
  app:cardCornerRadius="165dp"
  app:cardElevation="8dp"
  app:contentPadding="8dp"
  >
  

Приводит к несоответствию. Разные макеты приводят к жесткому кодированию разных размеров шрифта и полей, что делает приложение менее отточенным.

ПОПРОБУЙТЕ

 <?xml version="1.0" encoding="utf-8"?>
   <android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="@dimen/_125sdp"
    android:layout_height="@dimen/_35sdp"
    android:layout_marginEnd="@dimen/_5sdp"
    app:cardCornerRadius="@dimen/_150sdp"
    app:cardElevation="@dimen/_5sdp"
    app:contentPadding="@dimen/_5sdp"
    >
     .........
    <android.support.v7.widget.CardView
                android:layout_width="@dimen/_22sdp"
                android:layout_height="@dimen/_22sdp"
                app:cardCornerRadius="@dimen/_12sdp"
                app:cardElevation="0dp"
                >
  

ПРИМЕЧАНИЕ

Переключитесь на AndroidX .

AndroidX заменяет исходные API-интерфейсы библиотеки поддержки пакетами в пространстве имен androidx. Изменились только имена артефактов package и Maven; имена классов, методов и полей не изменились.

Нравится

 <androidx.cardview.widget.CardView