Android CardView显示异常:卡片被压缩,寻求修复方案
我之前也碰到过类似的CardView在手机端被压缩的问题,结合你给出的代码片段(虽然有点截断,但这类问题的常见坑我都摸得差不多了),给你几个大概率能解决的方案:
检查CardView的宽高与布局约束
很多时候压缩问题根源在于CardView的宽高设置不合理。如果是作为列表item使用,确保CardView的宽度设为match_parent(让它填满父布局的宽度),高度用wrap_content来自适应内容,别硬写固定高度。示例代码如下:android:layout_width="match_parent" android:layout_height="wrap_content"要是用了ConstraintLayout,得保证CardView的左右约束正确关联到父布局或相邻控件,避免出现宽度被挤压的情况。
启用CardView的兼容性内边距属性
CardView自带的两个属性cardUseCompatPadding和cardPreventCornerOverlap经常能解决布局异常问题。开启它们可以避免内容被圆角裁剪,同时保证内边距正常分配,不会挤压卡片:app:cardUseCompatPadding="true" app:cardPreventCornerOverlap="true"检查列表布局管理器(如果是RecyclerView场景)
如果你是把CardView作为RecyclerView的item,那布局管理器的设置很关键。比如用GridLayoutManager时,列数设置是否适配手机屏幕?要是列数设多了,每个item的CardView自然会被压缩。可以在代码里检查布局管理器的初始化:// 比如手机端设置为1列或2列,根据你的需求调整 RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getContext(), 1); recyclerView.setLayoutManager(layoutManager);另外,RecyclerView本身的宽高也要设为
match_parent,别让它自己被压缩,否则item也会跟着遭殃。排查父布局的布局设置
CardView的父布局如果是ScrollView、NestedScrollView这类可滚动布局,要确保父布局的高度设置为match_parent,而不是wrap_content,否则可能导致子布局(包括CardView)被挤压。要是父布局用了layout_weight,也要检查权重分配是否合理,别让CardView所在的布局权重占比太小。升级CardView依赖版本
旧版本的CardView可能存在兼容性bug,你可以把build.gradle里的CardView依赖升级到最新稳定版。如果之前用的是support库,建议迁移到AndroidX版本,避免新旧库冲突:implementation 'androidx.cardview:cardview:1.1.0'
内容的提问来源于stack exchange,提问作者Adir

