API 21及以下设备CardView不显示问题求助
问题描述
我的应用在API 22及以上设备中CardView可正常显示,但在API 21及以下设备中无法显示。已在Gradle文件中添加Google Maven仓库,尝试多种替代方案仍未解决,布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <ScrollView 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="match_parent" android:layout_height="match_parent" android:background="#CFD8DC" tools:context="com.example.ninjathegreat.ligaocitysolidwastemanagementv20.MainActivity"> <LinearLayout android:orientation="vertical" android:weightSum="10" android:layout_width="match_parent" android:layout_height="wrap_content"> <include layout="@layout/app_bar" android:id="@+id/app_bar" /> <RelativeLayout android:id="@+id/relativeID" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" /> <TextView android:id="@+id/eswm" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/eswm" android:layout_gravity="center" android:textSize="34sp" /> <GridLayout android:layout_marginTop="50dp" android:id="@+id/mainGrid" android:layout_width="match_parent" android:layout_height="412dp" android:layout_weight="8" android:alignmentMode="alignMargins" android:columnCount="2" android:columnOrderPreserved="false" android:padding="14dp" android:rowCount="3"> <!-- Row 1 --> <!-- Column 1 --> <android.support.v7.widget.CardView android:layout_width="0dp" android:layout_height="0dp" android:layout_columnWeight="1" android:layout_marginBottom="16dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_rowWeight="1" app:cardCornerRadius="8dp" app:cardElevation="8dp"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|center_vertical" android:layout_margin="16dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableTop="@drawable/gps" android:padding="5dp" android:text="@string/gps" android:textAlignment="center" android:textColor="#020202" android:textStyle="bold" /> </LinearLayout> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView android:layout_width="0dp" android:layout_height="0dp" android:layout_columnWeight="1" android:layout_marginBottom="16dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_rowWeight="1" app:cardCornerRadius="8dp" app:cardElevation="8dp"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|center_vertical" android:layout_margin="16dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableTop="@drawable/recycle" android:padding="5dp" android:text="@string/educational_guide" android:textAlignment="center" android:textColor="#020202" android:textStyle="bold" /> </LinearLayout> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView android:layout_width="0dp" android:layout_height="0dp" android:layout_columnWeight="1" android:layout_marginBottom="16dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_rowWeight="1" app:cardCornerRadius="8dp" app:cardElevation="8dp"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|center_vertical" android:layout_margin="16dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableTop="@drawable/calendar_2" android:padding="5dp" android:text="@string/waste_schedule" android:textAlignment="center" android:textColor="#020202" android:textStyle="bold" /> </LinearLayout> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView android:layout_width="0dp" android:layout_height="0dp" android:layout_columnWeight="1" android:layout_marginBottom="16dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_rowWeight="1" app:cardCornerRadius="8dp" app:cardElevation="8dp"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|center_vertical" android:layout_margin="16dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableTop="@drawable/info" android:padding="5dp" android:text="@string/information_1" android:textAlignment="center" android:textColor="#020202" android:textStyle="bold" /> </LinearLayout> </android.support.v7.widget.CardView> </GridLayout> </LinearLayout> </ScrollView>
可能的原因及解决建议
1. 低版本API对cardElevation的兼容问题
API 21及以下的Android系统不支持原生elevation属性,你使用的app:cardElevation虽为Support库属性,但低版本下若未配合兼容padding设置,可能导致CardView被挤压或隐藏。
解决方法:
给每个CardView添加app:cardUseCompatPadding="true",该属性会在低版本中自动添加与elevation对应的padding,确保CardView内容不被裁剪:
<android.support.v7.widget.CardView ... app:cardElevation="8dp" app:cardUseCompatPadding="true">
2. 未设置CardView背景色
API 21及以下的CardView默认背景可能与页面背景色(#CFD8DC)一致,导致视觉上看起来未显示。
解决方法:
显式设置CardView的背景色:
<android.support.v7.widget.CardView ... app:cardBackgroundColor="@android:color/white">
3. GridLayout在低版本的权重支持问题
你使用的GridLayout的layout_columnWeight和layout_rowWeight在API 21及以下系统中可能存在兼容性问题,导致CardView尺寸计算错误,显示为0dp。
解决方法:
- 替换GridLayout为
LinearLayout结合权重实现网格布局,或使用ConstraintLayout构建更兼容的布局; - 临时给CardView设置固定最小宽高(如
android:minWidth="150dp"、android:minHeight="150dp"),验证是否为尺寸计算问题。
4. Support库版本或依赖问题
你使用的旧版android.support.v7.widget.CardView可能存在低版本兼容bug,建议迁移到AndroidX库,其对低版本兼容性更好。
解决方法:
- 在Gradle中替换依赖为AndroidX的CardView:
implementation 'androidx.cardview:cardview:1.0.0'
- 布局中替换CardView引用为
androidx.cardview.widget.CardView:
<androidx.cardview.widget.CardView ...>
5. 主题未继承AppCompat主题
Support库控件需依赖AppCompat主题才能正常工作,若Activity主题继承自普通Theme.Light而非Theme.AppCompat系列,可能导致低版本控件显示异常。
解决方法:
在AndroidManifest.xml中确保Activity主题继承自AppCompat:
<activity android:name=".MainActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar">
内容的提问来源于stack exchange,提问作者JOSELITO BROMA

