You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:15:55