Android layout 在ConstraintLayout中处理GONE视图难题

Android layout 在ConstraintLayout中处理GONE视图难题,android-layout,android-constraintlayout,Android Layout,Android Constraintlayout,我有一个外观足够简单的布局,单使用xml是一个相当棘手的行为,即只使用ConstraintLayout的功能,而不必以编程方式执行任何操作 我考虑过障碍和指导线,以及许多没有成功的场景和试验;所以这是我最后的希望,也许其他人知道一些我不知道的事情 这是我的难题: 如果有3条线可见->图像应在第1行和第2行之间居中 二, 如果有两条线可见->图像应在第1行和第2行之间居中 第2行 如果1行可见(标签文本)->图像应居中于父对象,或 中心与第1行对齐(标签文字) 以下是一些图片来说明: 3行-正

我有一个外观足够简单的布局,单使用xml是一个相当棘手的行为,即只使用ConstraintLayout的功能,而不必以编程方式执行任何操作

我考虑过障碍和指导线,以及许多没有成功的场景和试验;所以这是我最后的希望,也许其他人知道一些我不知道的事情

这是我的难题:

  • 如果有3条线可见->图像应在第1行和第2行之间居中 二,
  • 如果有两条线可见->图像应在第1行和第2行之间居中 第2行
  • 如果1行可见(标签文本)->图像应居中于父对象,或 中心与第1行对齐(标签文字)
以下是一些图片来说明:

3行-正确

2行-正确

1行不正确,但目前为止我能得到的最好结果[当只有标签可见时]

1行按我希望的方式更正[当只有标签可见时]

代码:

将ImageView约束到标签_文本的顶部和第_1_行文本的底部



行是否始终对应于同一文本视图?例如,如果顶行是TextView#1,那么第一行可以是TextView#2吗?其他行也一样。@Cheticamp 3永远不会改变,只有它们的可见性可能会改变,顶部永远是“label_text”。华丽,适用于所有情况。我将添加我提出的另一个解决方案,以编程方式实现它,但我将使用您的解决方案,因为它是完美的。非常感谢。
<androidx.constraintlayout.widget.ConstraintLayout
    style="@style/V2.ItemList.Background"
    android:minHeight="@dimen/item_minimum_height"
    android:paddingVertical="@dimen/=margin_vertical">

    <ImageView
        android:id="@+id/icon"
        app:layout_constraintBottom_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="parent"
        tools:src="@drawable/ic_img"
        tools:visibility="visible" />

    <TextView
        android:id="@+id/label_text"
        app:layout_constraintBottom_toTopOf="@id/line1_text"
        app:layout_constraintEnd_toStartOf="@id/right_content"
        app:layout_constraintStart_toEndOf="@id/icon_start"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_chainStyle="packed"
        tools:text="Label" />

    <TextView
        android:id="@+id/line1_text"
        android:layout_marginTop="4dp"
        app:layout_constraintBottom_toTopOf="@id/line2_text"
        app:layout_constraintEnd_toStartOf="@id/right_content"
        app:layout_constraintStart_toEndOf="@id/icon"
        app:layout_constraintTop_toBottomOf="@id/label_text"
        tools:text="Line 1"
        tools:visibility="gone" />

    <TextView
        android:id="@+id/line2_text"
        android:layout_marginTop="4dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/right_content"
        app:layout_constraintStart_toEndOf="@id/icon"
        app:layout_constraintTop_toBottomOf="@id/line1_text"
        tools:text="Line 2"
        tools:visibility="gone" />

</androidx.constraintlayout.widget.ConstraintLayout>
private fun adjustConstraints() {
    if(binding.line1Text.isGone && binding.line1Text.isGone) {
        ConstraintSet().apply {
            clone(binding.itemListLayout)
            // Adjust left/start content for single line
            connect(
                R.id.icon,
                ConstraintSet.TOP,
                R.id.item_list_layout,
                ConstraintSet.TOP
            )
            connect(
                R.id.icon,
                ConstraintSet.BOTTOM,
                R.id.item_list_layout,
                ConstraintSet.BOTTOM
            )
            // Adjust right/end content for single line
            connect(
                R.id.right_content,
                ConstraintSet.TOP,
                R.id.item_list_layout,
                ConstraintSet.TOP
            )
            connect(
                R.id.right_content,
                ConstraintSet.BOTTOM,
                R.id.item_list_layout,
                ConstraintSet.BOTTOM
            )
        }.also {
            it.applyTo(binding.itemListLayout)
        }
    }
}
<ImageView
    android:id="@+id/icon"
    app:layout_constraintTop_toTopOf="@id/label_text"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintBottom_toBottomOf="@id/line1_text"
    tools:src="@drawable/ic_img"
    tools:visibility="visible" />