Android Studio中CardView占满整个宽度的问题求助
问题:发送消息的CardView占满RecyclerView宽度无法解决
我在RecyclerView中使用蓝色CardView展示发送的消息,另一个CardView展示接收的消息,但蓝色CardView始终占满整个宽度。尝试修改根布局宽度、设置CardView的maxWidth都没有效果,布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content"> <androidx.cardview.widget.CardView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginEnd="5dp" android:maxWidth="200dp" app:cardBackgroundColor="#147EFB" app:cardCornerRadius="25dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="wrap_content" android:layout_height="match_parent"> <TextView android:id="@+id/OutgoingSender" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="15dp" android:layout_marginTop="15dp" android:layout_marginEnd="90dp" android:text="No sender available" android:textColor="#FFFFFFFF" android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/OutgoingDate" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/OutgoingDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:layout_marginEnd="15dp" android:text="No date" android:textColor="#FFFFFFFF" android:textStyle="italic" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/OutgoingContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:layout_marginBottom="15dp" android:text="No message content available" android:textColor="#FFFFFFFF" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@+id/OutgoingSender" app:layout_constraintTop_toBottomOf="@+id/OutgoingSender" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.cardview.widget.CardView> </androidx.constraintlayout.widget.ConstraintLayout>
解决方案
问题根源
- CardView内部的ConstraintLayout设置了
android:layout_height="match_parent",会强制撑满CardView高度,导致布局计算异常进而拉宽CardView - 外层ConstraintLayout仅约束了CardView的
End和Top方向,未设置Start约束,配合内部固定margin让CardView无限向左延伸 OutgoingSender的android:layout_marginEnd="90dp"是固定值,会强制拉开CardView宽度,而非根据内容自适应
修改后的布局代码
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content"> <androidx.cardview.widget.CardView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginStart="5dp" android:layout_marginEnd="5dp" android:maxWidth="200dp" app:cardBackgroundColor="#147EFB" app:cardCornerRadius="25dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintWidth_default="wrap"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="15dp"> <TextView android:id="@+id/OutgoingSender" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="No sender available" android:textColor="#FFFFFFFF" android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/OutgoingDate" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/OutgoingDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:text="No date" android:textColor="#FFFFFFFF" android:textStyle="italic" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/OutgoingContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="No message content available" android:textColor="#FFFFFFFF" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@+id/OutgoingSender" app:layout_constraintTop_toBottomOf="@+id/OutgoingSender" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.cardview.widget.CardView> </androidx.constraintlayout.widget.ConstraintLayout>
关键修改点说明
- 给CardView添加
app:layout_constraintStart_toStartOf="parent"和app:layout_constraintWidth_default="wrap",让ConstraintLayout正确计算CardView的wrap_content宽度,同时maxWidth会生效限制最大宽度 - 将内部ConstraintLayout的
android:layout_height改为wrap_content,并把分散的margin改为统一的android:padding="15dp",布局更简洁且避免冲突 - 移除
OutgoingSender的固定marginEnd,给OutgoingDate添加android:layout_marginStart="8dp",让两个TextView之间保持自适应间距,不会强制拉宽布局
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

