【问题标题】:Android, how to auto adjust the item's vertical position in ConstraintLayoutAndroid,如何在 ConstraintLayout 中自动调整项目的垂直位置
【发布时间】:2020-03-04 14:51:59
【问题描述】:

有一个主要是左右部分的 ConstraintLayout。 右侧有固定内容。 左侧垂直包含一些项目,其中一些项目动态显示/隐藏。

像左边一样总是垂直居中,比如 当只有 AAA、CCC 可见时:

----------------  -----------------
|              | |                |
|              | |                |
|              | |                |
| AAA          | |                |
|              | |                |
| CCCC         | |                |
|              | |                |
|              | |                |
|              | |                |
-----------------------------------

当某些 ddd, BBB, BBB 可见时

----------------  -----------------
|              | |                |
| AAA          | |                |
|              | |                |
| AAA          | |                |
|              | |                |
| BBB          | |                |
|              | |                |
| CCC          | |                |
|              | |                |
-----------------------------------

做了一个但不能做垂直中心,如何使它不固定顶部/底部对齐,所有额外的高度空间应该分布在上方和下方:

-->

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/top_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20dp"
    >

    <TextView
        android:id="@id/title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp"
        android:ellipsize="end"
        android:maxLines="2"
        app:layout_constraintEnd_toStartOf="@id/_container"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0"
        app:layout_goneMarginEnd="0dp"
        app:layout_goneMarginStart="0dp"
        tools:text="title: lone test test test test test test test test test" />

    <View
        android:id="@+id/_rating"
        android:layout_width="80dp"
        android:layout_height="20dp"
        android:layout_marginEnd="6dp"
        android:layout_marginTop="6dp"
        android:layout_marginBottom="6dp"
        app:layout_constraintBottom_toTopOf="@id/_text"
        app:layout_constraintEnd_toStartOf="@id/_cta"
        app:layout_constraintHorizontal_bias="0.07"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/title"
        app:layout_constraintVertical_bias="0.79"
        tools:background="#ff0000"

        tools:visibility="gone"
        />

    <com.google.android.material.button.MaterialButton
        android:id="@+id/_cta"
        style="@style/Widget.MaterialComponents.Button.OutlinedButton"
        android:layout_width="wrap_content"
        android:layout_height="26dp"
        android:layout_marginTop="6dp"
        app:layout_constraintTop_toBottomOf="@id/title"
        app:layout_constraintStart_toEndOf="@id/_rating"

        android:maxLines="1"
        app:cornerRadius="20dp"

        android:textSize="9sp"
        android:textAllCaps="false"
        android:textColor="#770000ff"
        app:strokeColor="#770000ff"

        android:layout_marginLeft="6dp"

        android:insetTop="0dp"
        android:insetBottom="0dp"

        android:text="Install It"
        tools:visibility="gone"
        />

    <TextView
        android:id="@+id/_text"
        style="@style/doublePlay.textRegular"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp"

        android:ellipsize="end"
        android:maxLines="1"
        android:text="The Compmany"
        android:textSize="15sp"
        app:layout_constraintTop_toBottomOf="@id/_cta"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        />

    <ImageView
        android:id="@+id/_icon"
        android:layout_width="14dp"
        android:layout_height="14dp"
        android:layout_marginLeft="6dp"
        android:src="#ff00ff"
        app:layout_constraintTop_toTopOf="@id/_text"
        app:layout_constraintBottom_toBottomOf="@id/_text"
        app:layout_constraintStart_toEndOf="@id/_text" />


    <TextView
        android:id="@+id/_name"
        style="@style/doublePlay.textRegular"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="6dp"
        android:textSize="15sp"
        android:maxWidth="120dp"
        android:maxLines="1"
        android:ellipsize="end"
        app:layout_constraintTop_toTopOf="@id/_text"
        app:layout_constraintBottom_toBottomOf="@id/_text"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@id/_icon"
        tools:text="The Interest long long long long long" />

    <FrameLayout
        android:id="@+id/_container"
        android:layout_width="100dp"
        android:layout_height="114dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:src="@color/black"
        >

        <ImageView
            android:id="@+id/_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@null"
            android:scaleType="fitCenter"
            android:visibility="visible"
            tools:src="@color/blue"/>

        <FrameLayout
            android:id="@+id/_video"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="gone" />
    </FrameLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

    标签: android-constraintlayout


    【解决方案1】:

    将小部件放置在垂直链中,链样式为packed。现在,当一个小部件设置为gone 时,其他小部件将重新分配自己。这是一个例子:

    <androidx.constraintlayout.widget.ConstraintLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="24dp"
            android:text="AAAA"
            app:layout_constraintBottom_toTopOf="@+id/textView2"
            app:layout_constraintHorizontal_chainStyle="packed"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_chainStyle="packed" />
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="24dp"
            android:text="BBBB"
            app:layout_constraintBottom_toTopOf="@+id/textView3"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView1" />
    
        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="24dp"
            android:text="CCCC"
            app:layout_constraintBottom_toTopOf="@+id/textView4"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView2" />
    
        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="24dp"
            android:text="DDDD"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView3" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    所有小部件设置为可见:

    小部件“BBBB”和“DDDD”设置为gone

    【讨论】:

      【解决方案2】:

      而不是为布局左侧的每个小部件设置约束。将所有这些放在LinearLayout 中,设置它的android:orientation="vertical""android:gravity="start"。 (您可以尝试其他重力值以满足您的需要)。最后单独为这个LinearLayout 设置约束。父顶部和底部垂直对齐。并按照您的意愿开始父端到右框架。

      作为示例,我从您的 xml 中制作了一个示例

      <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/top_container"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:padding="20dp"
          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">
      
          <LinearLayout
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:gravity="start"
              android:orientation="vertical"
              app:layout_constraintBottom_toBottomOf="parent"
              app:layout_constraintEnd_toStartOf="@+id/_container"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintTop_toTopOf="parent">
      
              <TextView
                  android:id="@id/title"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:ellipsize="end"
                  android:maxLines="2"
                  tools:text="title: lone test test test test test test test test test" />
      
              <View
                  android:id="@+id/_rating"
                  android:layout_width="80dp"
                  android:layout_height="20dp"
                  tools:background="#ff0000" />
      
              <com.google.android.material.button.MaterialButton
                  android:id="@+id/_cta"
                  style="@style/Widget.MaterialComponents.Button.OutlinedButton"
                  android:layout_width="wrap_content"
                  android:layout_height="26dp"
                  android:insetTop="0dp"
                  android:insetBottom="0dp"
                  android:maxLines="1"
                  android:text="Install It"
                  android:textAllCaps="false"
                  android:textColor="#770000ff"
                  android:textSize="9sp"
                  app:cornerRadius="20dp"
                  app:strokeColor="#770000ff" />
      
              <TextView
                  android:id="@+id/_text"
                  style="@style/doublePlay.textRegular"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:ellipsize="end"
                  android:maxLines="1"
                  android:text="The Compmany"
                  android:textSize="15sp" />
      
              <ImageView
                  android:id="@+id/_icon"
                  android:layout_width="14dp"
                  android:layout_height="14dp"
                  android:src="#ff00ff" />
      
      
              <TextView
                  android:id="@+id/_name"
                  style="@style/doublePlay.textRegular"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:ellipsize="end"
                  android:maxLines="1"
                  android:textSize="15sp"
                  tools:text="The Interest long long long long long" />
      
          </LinearLayout>
      
          <FrameLayout
              android:id="@+id/_container"
              android:layout_width="100dp"
              android:layout_height="114dp"
              app:layout_constraintBottom_toBottomOf="parent"
              app:layout_constraintEnd_toEndOf="parent"
              app:layout_constraintTop_toTopOf="parent"
              tools:src="@color/black" >
      
              <ImageView
                  android:id="@+id/_image"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:contentDescription="@null"
                  android:scaleType="fitCenter"
                  android:visibility="visible"
                  tools:src="@color/blue"/>
      
              <FrameLayout
                  android:id="@+id/_video"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content" />
          </FrameLayout>
      
      </androidx.constraintlayout.widget.ConstraintLayout>
      

      试试看这是否能帮助你实现你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-20
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        相关资源
        最近更新 更多