LinearLayout 未显示其所有子项

LinearLayout not showing all its children

在创建一个以 ImageView 为子项的 LinearLayout 之后,我注意到只显示了第一行项目。我认为 LinearLayout 会根据需要自动将其子项换行?宽度看起来不错,但高度不行。

预期结果

预期蓝图(ImageView 计数未按比例计算)

出于某种原因,当我在另一个视图中创建一个 LinearLayout 时,宽度显示正确,但它似乎从未调整其高度以适应并显示其中的所有子项。

当前结果

<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/cv_facilities">

    <LinearLayout
        android:id="@+id/ll_facilities"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">

        <LinearLayout
            android:id="@+id/ll_titlerow"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/iv_expandcollapsearrow"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="10dp" />

            <ImageView
                android:id="@+id/iv_topicsymbol"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="10dp" />

            <LinearLayout
                android:id="@+id/ll_symbols"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
                <ImageView
                    android:id="@+id/iv_symbol_a"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_language" />

                <ImageView
                    android:id="@+id/iv_symbol_b"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_pets" />

                <ImageView
                    android:id="@+id/iv_symbol_c"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_verified_user" />

                <ImageView
                    android:id="@+id/iv_symbol_d"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_transport" />

                <ImageView
                    android:id="@+id/iv_symbol_e"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_seat" />

                <ImageView
                    android:id="@+id/iv_symbol_f"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_fingerprint" />

                <ImageView
                    android:id="@+id/iv_symbol_g"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_areoplane_depart" />

                <ImageView
                    android:id="@+id/iv_symbol_h"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_areoplane_arrive" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</androidx.cardview.widget.CardView>

水平 LinearLayout 不会自动换行以适合其子项。根据 Android 文档,它只支持一个方向:

LinearLayout is a view group that aligns all children in a single direction, vertically or horizontally

您可以使用 flexbox-layout 实现环绕行为。

不要使用 6 个 imageView 制作水平 linearLayout

制作新的垂直线性布局,并为每个 3 个 imageView 放置两个水平线性布局。

LinearLayout 的这种行为是 "as intended":它将以水平或垂直线显示其子项。

由于您的蓝图中所有子 View 的大小似乎都相似,请考虑切换到 GridLayout,它可以作为 androidx-library(例如 androidx.gridlayout:gridlayout:1.0.0).

对于尺寸不同的 View 儿童,FlexboxLayout 是一个不错的选择。它于 2017 年 2 月在 blog post 中引入。有一个适用于 androidx 的版本:'com.google.android:flexbox:1.1.0'