layout_weight 的行为不符合预期

问题描述

在我的应用程序中,我想将元素定位在卡片视图下,使用值为 .3 和 .7 的 layout_weight。然而,它所占用的空间似乎取决于我的卡片视图所拥有的文本长度。示例代码如下:

第一张卡片视图:

<androidx.cardview.widget.CardView
    android:id="@+id/card_view_terminal"
    android:layout_width="match_parent"
    android:layout_height="118dp"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardCornerRadius="5dp"
    android:layout_marginHorizontal="15dp"
    card_view:cardElevation="4dp"
    android:layout_marginTop="22dp">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginHorizontal="14dp"
        android:gravity="center_vertical"
        android:weightSum="1">


        <androidx.appcompat.widget.AppCompatimageView
            android:layout_width="69dp"
            android:layout_height="60dp"
            android:src="@drawable/use_card_reader"
            android:scaleType="centerInside"
            android:layout_weight=".3"
            android:background="@color/colorAccent"
            />

        <LinearLayout
            android:background="#87ceeb"
            android:layout_weight="0.7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Read Card"
                android:textColor="@color/navy"
                android:textSize="17sp"
                android:textStyle="bold"
                android:textAlignment="center"
                card_view:fontFamily="@font/assistant_semibold" />


            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Click here to read the card"
                android:textSize="14sp"
                android:fontFamily="@font/assistant"
                android:textColor="@color/navy"
                android:textAlignment="textStart"
                />

        </LinearLayout>

    </LinearLayout>
</androidx.cardview.widget.CardView>

第二张卡片视图:

[![<androidx.cardview.widget.CardView
    android:id="@+id/manual_entry"
    android:layout_width="match_parent"
    android:layout_height="118dp"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardCornerRadius="5dp"
    android:layout_marginHorizontal="15dp"
    card_view:cardElevation="4dp"
    android:layout_marginTop="22dp"
    >

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="14dp"
        android:weightSum="1"
        android:gravity="center_vertical"
        android:layout_marginEnd="14dp">


        <androidx.appcompat.widget.AppCompatimageView
            android:layout_width="69dp"
            android:layout_height="54dp"
            android:src="@drawable/manual_fill"
            android:scaleType="centerInside"
            android:layout_weight=".3"
            android:background="@color/colorAccent"
            />

        <LinearLayout
            android:background="#87ceeb"
            android:layout_weight="0.7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Read Paper"
                android:textColor="@color/navy"
                android:textSize="17sp"
                android:textStyle="bold"
                android:textAlignment="center"
                card_view:fontFamily="@font/assistant_semibold" />


            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="This is some long explanation text"
                android:textSize="14sp"
                android:fontFamily="@font/assistant"
                android:textColor="@color/navy"
                android:textAlignment="textStart"
                />

        </LinearLayout>

    </LinearLayout>

</androidx.cardview.widget.CardView>

附上图片

enter code here

如您所见,第二张卡片的图像长度较短,因为右侧的文本较长。我该如何解决这个问题,无论后面是什么文本,视图都将占用 0.3 和 0.7 的空间?

解决方法

You need to take static layout height.

<androidx.cardview.widget.CardView
    android:id="@+id/card_view_terminal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardCornerRadius="5dp"
    android:layout_marginHorizontal="15dp"
    card_view:cardElevation="4dp"
    android:layout_marginTop="22dp">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="118dp"
        android:layout_marginHorizontal="14dp"
        android:gravity="center_vertical"
        android:weightSum="1">


        <androidx.appcompat.widget.AppCompatImageView
            android:layout_width="69dp"
            android:layout_height="60dp"
            android:src="@drawable/use_card_reader"
            android:scaleType="centerInside"
            android:layout_weight=".3"
            android:background="@color/colorAccent"
            />

        <LinearLayout
            android:background="#87ceeb"
            android:layout_weight="0.7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Read Card"
                android:textColor="@color/navy"
                android:textSize="17sp"
                android:textStyle="bold"
                android:textAlignment="center"
                card_view:fontFamily="@font/assistant_semibold" />


            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Click here to read the card"
                android:textSize="14sp"
                android:fontFamily="@font/assistant"
                android:textColor="@color/navy"
                android:textAlignment="textStart"
                />

        </LinearLayout>

    </LinearLayout>
</androidx.cardview.widget.CardView>
,

LinerLayout 中的 layout_weight 以使其按预期工作,您应该注意这一点:

如果 LinerLayout 方向是垂直的,那么孩子的高度应该是 0dp 并且 layout_weight 值将决定孩子的高度>

如果 LinerLayout 方向是水平的,那么孩子的宽度应该是 0dp 并且 layout_weight 值将决定孩子的宽度

所以在你的代码中,孩子应该是这样的:

   <LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginStart="14dp"
    android:weightSum="1"
    android:gravity="center_vertical"
    android:layout_marginEnd="14dp">


    <androidx.appcompat.widget.AppCompatImageView
        android:layout_width="odp"
        android:layout_height="54dp"
        android:src="@drawable/manual_fill"
        android:scaleType="centerInside"
        android:layout_weight=".3"
        android:background="@color/colorAccent"
        />

    <LinearLayout
        android:background="#87ceeb"
        android:layout_weight="0.7"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Read Paper"
            android:textColor="@color/navy"
            android:textSize="17sp"
            android:textStyle="bold"
            android:textAlignment="center"
            card_view:fontFamily="@font/assistant_semibold" />


        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="This is some long explanation text"
            android:textSize="14sp"
            android:fontFamily="@font/assistant"
            android:textColor="@color/navy"
            android:textAlignment="textStart"
            />

    </LinearLayout>

</LinearLayout>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...