【问题标题】:ConstraintLyaout GONE view doesn't affect constraintsConstraintLyaout GONE 视图不影响约束
【发布时间】:2021-12-28 13:45:34
【问题描述】:

我有这个布局:

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/myLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/text2"
        android:text="Left"
        android:textSize="20sp"
        app:layout_constraintTop_toTopOf="parent"/>
    
    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:text="Center"
        android:textSize="20sp"
        app:layout_constraintTop_toTopOf="parent"/>
    
    <TextView
        android:id="@+id/text3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/text2"
        android:text="Right"
        android:textSize="20sp"
        app:layout_constraintTop_toTopOf="parent"/>
        

</androidx.constraintlayout.widget.ConstraintLayout>

当我将中心和左侧文本视图的可见性更改为消失时,右侧文本视图仍保留在右侧,而不是因为约束消失而被拉到左侧。

知道为什么吗?

【问题讨论】:

  • 看来 android:id="@+id/text2" 受到父母的约束(开始和结束),而其他文本视图以某种方式受到约束(开始或结束)。它创建了一个奇怪的依赖关系。我想这是因为它不知道如何正确显示它。
  • 感谢@Eguti 我尝试使用指南更改中心 textview 约束,但仍然无法正常工作,它的行为相同。这个想法是我需要第二个文本视图始终居中,并且侧面文本视图与之对齐
  • 在中心文本可见性消失的那一刻,它会发生什么?
  • 我希望右视图与左对齐

标签: android android-constraintlayout


【解决方案1】:

为了解决这个问题,我建议你使用 LinearLayout 和属性 weightSum。所以它会是这样的:

<LinearLayout
    android:id="@+id/myLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="3">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Left"
        android:textSize="20sp"
        android:gravity="center"
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Center"
        android:textSize="20sp"
        android:gravity="center"
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/text3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Right"
        android:textSize="20sp"
        android:gravity="center"
        android:layout_weight="1"/>
</LinearLayout>

【讨论】:

    【解决方案2】:

    如果您将左侧视图和中心视图设为gone,则不应期望右侧视图会一直拉到左侧。当视图被创建gone 时,它们被缩小到一个点(零宽度和高度),但它们的约束保持不变。在其gone 状态下,右视图被限制在仍位于布局中心的中心视图。见Visibility Behavior。此链接上的图表有点误导,因为它可能看起来(最初对我来说是这样)视图“B”假设视图“A”的左约束。情况并非如此:所有约束都保持在应用 gone 之前的状态。

    这就是“为什么”和您问题的答案。可能有几种方法可以解决它。保持当前布局不变的一种方法是将中心视图的水平偏差更改为零,这将在创建视图时将其一直向左移动gone。您还将使右视图的偏差为零,以将其一直向左移动。如果让视图再次可见,则需要将偏差重置为 50%。

    【讨论】:

      【解决方案3】:

      我使用屏障和app:barrierAllowsGoneWidgets="false" 进行了修复,并将右视图设置为受限于屏障

      <androidx.constraintlayout.widget.ConstraintLayout
          android:id="@+id/myLayout"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
      
          <TextView
              android:id="@+id/text1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintEnd_toStartOf="@id/text2"
              android:text="Left"
              android:visibility="gone"
              android:textSize="20sp"
              app:layout_constraintTop_toTopOf="parent"/>
      
          <TextView
              android:id="@+id/text2"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintEnd_toEndOf="parent"
              android:text="Center"
              android:visibility="gone"
              android:textSize="20sp"
              
              app:layout_constraintTop_toTopOf="parent"/>
      
          <androidx.constraintlayout.widget.Guideline
              android:id="@+id/guideLine"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              app:layout_constraintGuide_percent="0.5"
              android:orientation="vertical"/>
      
      
          <TextView
              android:id="@+id/text3"
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              app:layout_constraintEnd_toEndOf="parent"
              app:layout_constraintStart_toEndOf="@id/barrier"
              android:text="Right"
              android:textSize="20sp"
              app:layout_constraintTop_toTopOf="parent"/>
          
          <androidx.constraintlayout.widget.Barrier
              android:id="@+id/barrier"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              app:barrierAllowsGoneWidgets="false"
              app:constraint_referenced_ids="text1,text2"
              app:barrierDirection="end"/>
      
      
      </androidx.constraintlayout.widget.ConstraintLayout>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 2017-02-14
        • 2013-05-15
        相关资源
        最近更新 更多