ConstraintLayout:如果依赖视图可见性设置为GONE,则重新调整基线约束

时间:2017-04-07 09:07:21

标签: android android-constraintlayout

如果依赖视图可见性设置为GONE,是否有任何方法可以重新调整TextView的基线约束?

我的布局代码:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEST TITLE"
        android:textColor="@color/black"
        android:textSize="24sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

    <TextView
        android:id="@+id/subtitle1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SUBTITLE 1"
        android:textSize="11sp"
        app:layout_constraintBaseline_toBaselineOf="@+id/subtitle2"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/subtitleSpace"
        app:layout_constraintRight_toRightOf="parent"/>

    <android.support.v4.widget.Space
        android:id="@+id/subtitleSpace"
        android:layout_width="12dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toRightOf="@+id/subtitle1"
        app:layout_constraintRight_toLeftOf="@+id/subtitle2"/>

    <TextView
        android:id="@+id/subtitle2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:text="SUBTITLE 2"
        android:textSize="14sp"
        app:layout_constraintLeft_toRightOf="@+id/subtitleSpace"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title"/>

</android.support.constraint.ConstraintLayout>

在这种情况下,我的布局如下所示: enter image description here

当我将subtitle2 TextView可见性设置为GONE时,我的布局将如下所示: enter image description here

所以我想知道是否存在一些约束,如果缺少相关视图,是否可以重新调整基线。

2 个答案:

答案 0 :(得分:1)

可以为GONE窗口小部件指定备用边距(请参阅Margins when connected to a GONE widget),但我不知道基线的这种替代方法。

满足您要求的一种方法是指定一个0dp不可见TextView,其GONE TextView具有与同一视图相邻的特征。 subtitle1subtitle2将绑定到此新TextView的基线。即使新的TextView没有在屏幕上显示并且宽度为零,它仍然保持基线。

现在,当subtitle2成为GONE时,subtitle1将移动到中心但保持其垂直位置。 (使用空文本指定0dpinvisible是多余的,但会明确表示不应显示小部件。)

以下是包含这些更改的XML:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEST TITLE"
        android:textColor="#FF000000"
        android:textSize="24sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

    <TextView
        android:id="@+id/subtitle1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SUBTITLE 1"
        android:textSize="11sp"
        app:layout_constraintBaseline_toBaselineOf="@+id/viewForBaseline"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/subtitleSpace"
        app:layout_constraintRight_toRightOf="parent" />

    <android.support.v4.widget.Space
        android:id="@+id/subtitleSpace"
        android:layout_width="12dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toRightOf="@+id/subtitle1"
        app:layout_constraintRight_toLeftOf="@+id/subtitle2" />

    <TextView
        android:id="@+id/subtitle2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:text="SUBTITLE 2"
        android:textSize="14sp"
        android:visibility="gone"
        app:layout_constraintBaseline_toBaselineOf="@+id/viewForBaseline"
        app:layout_constraintLeft_toRightOf="@+id/subtitleSpace"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title" />

    <TextView
        android:id="@+id/viewForBaseline"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:textSize="14sp"
        android:visibility="invisible"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title" />

</android.support.constraint.ConstraintLayout> 

答案 1 :(得分:0)

您可以在 xml 代码之外以编程方式执行此操作。这不是理想的解决方案,但您最终会得到您想要的精确约束集。基本理念:

private val defaultConstrainSet = ConstraintSet()
private val newConstrainSet = ConstraintSet()

init {
    defaultConstrainSet.clone(constraintLayout)
    newConstrainSet.apply {
        clone(constraintLayout)
        // here put your new constrains, eg. :
        clear(R.id.subtitle1, ConstraintSet.BASELINE)
        connect(R.id.agenda_index, ConstraintSet.TOP, R.id.title, ConstraintSet.BOTTOM)
    }
}

然后

    if (/* subtitle2 is visible */) {
        defaultConstrainSet.applyTo(constraintLayout)
    } else {
        newConstrainSet.applyTo(constraintLayout)
    }