具有多个子项的水平LinearLayout,当没有更多水平空间时,在新行上移动子项

时间:2013-08-24 00:15:07

标签: android android-layout android-linearlayout

我希望水平LinearLayout屏幕一样宽,并且与孩子一样高,但诀窍在于它的孩子每个都有动态宽度,我不希望它们离开屏幕(切出)。我希望它们在新行中流动/中断,以便它们都可见。

虽然与Android完全无关,但它应该与内联<div>在HTML中的工作方式类似。

这就是我现在所拥有的:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="If you would enter some digits in this field " />
        <EditText
            android:id="@+id/tvDistance"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="enter some digits here"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" that would be great" />
    </LinearLayout>

但是LinearLayout的孩子一旦比屏幕更宽,额外的部分就会离开屏幕/看不见。

2 个答案:

答案 0 :(得分:16)

  

我希望有一个与...一样宽的水平LinearLayout   屏幕和它的孩子一样高,但诀窍是它的孩子   每个都有动态宽度,我不希望它们离开屏幕   (剪掉)。

LinearLayout无法做到这一点(SDK中的任何默认布局都无法做到这一点),因为LinearLayout设置为所有 strong>一个水平或垂直线。此外,任何类型的基于尚未提供的维度的条件布局规则(例如,LinearLayout的可用宽度)都无法在xml中实现。

你需要的是一个自定义布局,它测量孩子们使用可用空间移动下面一个新线上的任何非适合孩子(所谓的FlowLayout)。

编辑:

Google现在提供了flexbox库,该库在Android上实现了web的flexbox布局。使用该库,FlexboxLayout的子项将根据其宽度放置在多行上,方法是使用flexDirection(值为)和{{1} (值为 wrap )属性。

答案 1 :(得分:5)

除了Flexbox,您还可以使用ChipGroup,它是材料设计库的一部分 ChipGroup也可以是其他组件的容器,它不必是Chip,也可以是按钮等。

一个ChipGroup用于容纳多个芯片。默认情况下,芯片是 跨多行回流。将app:singleLine属性设置为 将芯片限制在一条水平线上。如果这样做,您将 通常希望将此ChipGroup包装在Horizo​​ntalScrollView中。

<com.google.android.material.chip.ChipGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp">

        <com.google.android.material.chip.Chip
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:chipText="This" />

        <com.google.android.material.chip.Chip
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:chipText="is" />

        <com.google.android.material.chip.Chip
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:chipText="a" />

        <com.google.android.material.chip.Chip
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:chipText="because" />

        <com.google.android.material.chip.Chip
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:chipText="chip" />

        <com.google.android.material.chip.Chip
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:chipText="group" />


    </com.google.android.material.chip.ChipGroup>

已更新:

Constraint Layout 2.0开始,我们现在可以使用Flow

<androidx.constraintlayout.helper.widget.Flow
   android:layout_width="0dp"
   android:layout_height="wrap_content"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintTop_toTopOf="parent"
   app:flow_wrapMode="chain"
   app:constraint_referenced_ids="card1, card2, card3"
   />

通知app:constraint_referenced_ids app:flow_wrapMode

第一个关于传递视图,第二个关于处理包装视图的方式。

请务必在official documentation

上阅读有关内容