问题描述
我的约束布局看起来像这样:
A-B
--------- (barrier that refer to A and B bottom)
C (constraint_top_bottomOf barrier)
代码如下:
<?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="match_parent"
tools:context=".TypographyActivity"
android:background="?attr/lightPrimary">
<TextView
android:id="@+id/textviewA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/textviewB"
app:layout_constraintTop_toTopOf="parent"
android:text="Text A" />
<TextView
android:id="@+id/textviewB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintStart_toEndOf="@id/textviewA"
app:layout_constraintTop_toTopOf="parent"
android:text="Text B" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="textviewA,textviewB" />
<TextView
android:id="@+id/textviewC"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_goneMarginTop="30dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/barrier"
android:text="Text C" />
</androidx.constraintlayout.widget.ConstraintLayout>
即使在A和B可见的情况下,textviewC中的goneMarginTop也总是触发。
当A和B消失而又不将A和B包装到另一个布局时,是否有一种方法可以将doneMarginTop添加到textviewC中?
谢谢。
解决方法
障碍不会显示在布局中,并且我相信它们总是设置为“ gone”。这就是为什么您在文本视图“ C”上看到空白的原因-它被限制为“ gone”小部件。
如果要使用消失的边距,则必须将文本视图“ C”限制为在文本视图“ A”和“ B”都消失时消失的窗口小部件。一种实现方法是创建一个 Space 小部件,并将其顶部限制为障碍。然后将“ C”的顶部限制为 Space 小部件。您必须确保当“ A”和“ B”都消失时 Space 小部件消失,而当“ A”或“ B”(或两者)都可见时,则可见。
详细信息取决于您的需求,但总体布局如下所示:
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_light">
<TextView
android:id="@+id/textviewA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Text A"
android:visibility="visible"
app:layout_constraintEnd_toStartOf="@+id/textviewB"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textviewB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Text B"
android:visibility="visible"
app:layout_constraintStart_toEndOf="@id/textviewA"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="textviewA,textviewB" />
<Space
android:id="@+id/space"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/barrier" />
<TextView
android:id="@+id/textviewC"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Text C"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/space"
app:layout_goneMarginTop="30dp" />
</androidx.constraintlayout.widget.ConstraintLayout>