Android布局:优惠券图标隐藏后调整TextView的对齐位置
问题描述

当优惠券小图标(对应布局中的如下控件)隐藏时:
<androidx.appcompat.widget.AppCompatImageView android:id="@+id/imageViewCoupon" android:layout_width="14dp" android:layout_height="14dp" android:layout_marginStart="12dp" android:layout_marginTop="1dp" android:scaleType="fitXY" android:src="@drawable/icon_coupon" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toBottomOf="@+id/textViewTitle" tools:visibility="gone"/>

希望textViewDescription能对齐到图中绿色框标注的位置,尝试使用Barrier但未成功实现,完整布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <com.google.android.material.card.MaterialCardView xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:elevation="@dimen/margin_0dp" app:cardElevation="0dp" android:layout_height="wrap_content"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/layoutCartItem" android:layout_width="match_parent" android:layout_height="72dp"> <View android:id="@+id/highlineView" android:layout_width="@dimen/margin_6dp" android:layout_height="match_parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" android:background="@color/yellowHighlineColor" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideLineDisplayDateVertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.13"/> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideLineDisplayDateHorizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.5"/> <com.google.android.material.textview.MaterialTextView android:id="@+id/textViewDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:includeFontPadding="false" android:gravity="center_vertical|end" android:lineSpacingExtra="@dimen/order_label_lines_pace_extra" android:textStyle="bold" android:maxLength="2" android:layout_marginBottom="-6dp" android:textColor="@color/blackSectionTitle" android:textSize="@dimen/text_size_20sp" app:fontFamily="@font/ibmp_lexsansthai_semi" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="@id/guideLineDisplayDateVertical" app:layout_constraintBottom_toTopOf="@id/guideLineDisplayDateHorizontal" tools:text="12" /> <com.google.android.material.textview.MaterialTextView android:id="@+id/textViewDay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:includeFontPadding="false" android:lineSpacingExtra="@dimen/order_label_lines_pace_extra" android:textColor="@color/blackSectionTitle" android:textSize="@dimen/text_size_12sp" android:maxLength="3" app:fontFamily="@font/ibmp_lexsansthai_regular" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="@id/guideLineDisplayDateVertical" app:layout_constraintTop_toBottomOf="@id/guideLineDisplayDateHorizontal" tools:text="Mon" /> <com.airbnb.lottie.LottieAnimationView android:id="@+id/imageView" android:layout_width="@dimen/margin_44dp" android:layout_height="@dimen/margin_44dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@id/guideLineDisplayDateVertical" app:layout_constraintTop_toTopOf="parent" tools:src="@tools:sample/avatars" /> <com.google.android.material.textview.MaterialTextView android:id="@+id/textViewTitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="12dp" android:layout_marginTop="@dimen/margin_12dp" android:ellipsize="end" android:textSize="14sp" android:textStyle="bold" android:gravity="start" android:maxLines="1" android:textColor="@color/blackSectionTitle" app:fontFamily="@font/ibmp_lexsansthai_semi" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintEnd_toStartOf="@id/imageViewChevron" app:layout_constraintTop_toTopOf="parent" tools:text="This is the title" /> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/imageViewCoupon" android:layout_width="14dp" android:layout_height="14dp" android:layout_marginStart="12dp" android:layout_marginTop="1dp" android:scaleType="fitXY" android:src="@drawable/icon_coupon" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toBottomOf="@+id/textViewTitle" tools:visibility="visible"/> <com.google.android.material.textview.MaterialTextView android:id="@+id/textViewDescription" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="-3dp" android:textSize="12sp" android:ellipsize="end" android:layout_marginStart="4dp" android:layout_marginBottom="14dp" android:gravity="center_vertical|start" android:lineSpacingExtra="@dimen/order_label_lines_pace_extra" android:maxLines="1" android:textColor="#FF3D1C" app:fontFamily="@font/ibmp_lexsansthai_regular" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/imageViewCoupon" app:layout_constraintEnd_toStartOf="@id/imageViewChevron" app:layout_constraintTop_toBottomOf="@+id/textViewTitle" tools:text="This is the description" /> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/imageViewChevron" android:layout_width="20dp" android:layout_height="20dp" android:layout_marginEnd="12dp" android:scaleType="fitXY" app:layout_constraintHorizontal_bias="1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:src="@drawable/icons_chevron_right" /> </androidx.constraintlayout.widget.ConstraintLayout> </com.google.android.material.card.MaterialCardView>
解决方案
方案1:使用goneMargin(推荐,代码改动少)
修改textViewDescription的约束,让它同时关联imageViewCoupon和imageView,并设置当imageViewCoupon隐藏时的左边距:
<com.google.android.material.textview.MaterialTextView android:id="@+id/textViewDescription" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="-3dp" android:textSize="12sp" android:ellipsize="end" android:layout_marginStart="4dp" android:layout_marginBottom="14dp" android:gravity="center_vertical|start" android:lineSpacingExtra="@dimen/order_label_lines_pace_extra" android:maxLines="1" android:textColor="#FF3D1C" app:fontFamily="@font/ibmp_lexsansthai_regular" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/imageViewCoupon" app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_goneMarginStart="12dp" <!-- 和imageViewCoupon的marginStart保持一致 --> app:layout_constraintEnd_toStartOf="@id/imageViewChevron" app:layout_constraintTop_toBottomOf="@+id/textViewTitle" tools:text="This is the description" />
方案2:使用Barrier(修正之前的错误用法)
在布局中添加Barrier,关联imageView和imageViewCoupon,再让textViewDescription依赖Barrier:
<!-- 在imageViewCoupon之后添加Barrier --> <androidx.constraintlayout.widget.Barrier android:id="@+id/barrier" android:layout_width="wrap_content" android:layout_height="wrap_content" app:barrierDirection="end" <!-- 方向设为end,取两个控件的最右侧 --> app:constraint_referenced_ids="imageView,imageViewCoupon"/> <!-- 修改textViewDescription的start约束 --> <com.google.android.material.textview.MaterialTextView android:id="@+id/textViewDescription" ... app:layout_constraintStart_toEndOf="@+id/barrier" ... />
之前使用Barrier失败大概率是方向设置错误,或者未正确关联两个控件。
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

