无法使用“fill_parent”获得正确的布局

9
我正在尝试在Android中创建这个简单的布局。
A应该根据其内容自动调整大小,并左对齐和垂直居中。
B应该尽可能地扩展,填充所有空白区域。
C应该右对齐,根据其内容自动换行并垂直居中对齐。
以下是我的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="left|center_vertical">
    <!-- A -->
    <ImageView android:id="@+id/example_item_icon"
            android:layout_width="48px"
            android:layout_height="48px"/>
    <!-- B -->
    <LinearLayout android:orientation="vertical"
             android:layout_width="wrap_content"
             android:layout_height="fill_parent"
             android:gravity="left|center_vertical"
             android:padding="5px">

        <TextView android:id="@+id/example_item_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"/>

        <TextView android:id="@+id/example_item_level_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold|italic"
                android:lines="1"
                android:textSize="10px"/>
    </LinearLayout>
    <!-- C -->
    <TextView android:id="@+id/example_item_count_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textSize="14px"/>
</LinearLayout>

在这种布局中,C 被推到屏幕外。我该怎么让这个布局生效?
4个回答

20

fill_parent 的含义是「与父容器一样大」,而不是「使用其余的空白空间」。所以,可以使用android:layout_width="0dip"和android:layout_weight="1"来代替 fill_parent。


哦,我理解成 fill_parent 意味着“尽可能地展开以填充父级”,而不像 match_parent 一样“文字上匹配父级的大小”。 - Naftuli Kay
1
match_parent 是 fill_parent 的新名称 :) - Romain Guy
我知道这很老了,但你能帮我理解为什么它有效吗? - Marcus
5
@G_M 父布局的高度和宽度都设置为match_parent,因此填充了整个屏幕。关键在于组织A、B、C以使它们适当地填充父视图中的空间。这正是权重的目的。通过给B赋予1的权重,并在A和C上没有使用权重,您告诉父布局将所有的空间都分配给B,将A和C压缩到它们的最小宽度(即包装其内容)。因此,对于B而言,width属性是无用的,因此我们将其设置为0dp以获得更好的性能。希望这回答了您的问题。 - Joffrey
为什么你这么聪明 :) - Fareed Alnamrouti

2

技巧是使用相对布局... 这里有一个例子(脑海中的例子-未经检查,缺少高度字段和垂直对齐设置,以使重要内容易于查看)。

提示:使用相对布局可以轻松地实现灵活的布局,而不必担心屏幕尺寸或方向的变化。
<relativelayout android:width="fillParent">
    <textview android:id="@+id/left" android:text="left" 
              android:width="wrap_content"
              android:layout_alignParentleft="true" />
    <textview android:id="@+id/right" android:text="right"
              android:width="wrap_content"
              android:layout_alignParentright="true" />
    <textview android:id="@+id/middle" android:text="middle"
              android:width="wrap_content"
              android:layout_alignleft="@id/right" android:layout_alignright="@id/left" />
</relativelayout>

编辑:这里已经修正了拼写错误(并且已测试可以使用)

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TextView
    android:id="@+id/left"
    android:text="left"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true" />
<TextView
    android:id="@+id/right"
    android:text="right"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true" />
<TextView
    android:id="@+id/middle"
    android:text="middle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/right"
    android:layout_toRightOf="@id/left" />
</RelativeLayout>

TextView 中间是 wrap_content,它不会扩展。 - max4ever
它可以在中间的TextView上使用width=wrap_content。我添加了一个已更正拼写错误的版本 - 试一下吧。 - SteelBytes
不错!使用“toLeftOf”/“toRightOf”似乎会强制“middle”扩展,直到填满“right”和“left”之间的所有空白空间,即它是LinearLayout的layout_weight的(近似)等效物。谢谢! - Giorgos Kylafas

0

试试这个。我用TextViews替换了ImageViews,以便更容易在XML编辑器中显示。请注意,我保留了"A"上的48px宽度,但我认为这并不是你真正想要的。请将其替换为wrap_content。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="center_vertical">

    <!-- A -->
    <TextView android:layout_height="48px"
    android:id="@+id/example_item_count_text2"
    android:textSize="14px"
    android:layout_weight="1"
    android:text="this is item a"
    android:textStyle="bold"
    android:layout_width="48px">
    </TextView>

    <!-- B -->
    <LinearLayout android:orientation="vertical"
             android:layout_width="wrap_content"
             android:layout_height="fill_parent"
             android:gravity="center_vertical"
             android:layout_weight="1"
             android:padding="5px">

        <TextView android:id="@+id/example_item_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="this is B"
                android:textStyle="bold"/>

        <TextView android:id="@+id/example_item_level_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="this should be underneath B"
                >
    </LinearLayout>

    <!-- C -->
    <TextView android:id="@+id/example_item_count_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="this is item c"
            android:layout_weight="1"
            android:textStyle="bold"
            android:textSize="14px"/>
</LinearLayout>

0
这是我的答案。我只是在B上设置了layout_weight1。显然,layout_weight类似于基于百分比的布局方法。我不知道它是如何工作的,但这是我的成品,看起来很棒:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="left|center_vertical">

    <ImageView android:id="@+id/example_item_icon"
            android:layout_width="48px"
            android:layout_height="48px"/>

    <LinearLayout android:orientation="vertical"
             android:layout_width="wrap_content"
             android:layout_height="fill_parent"
             android:gravity="left|center_vertical"
             android:layout_weight="1"
             android:padding="5px">

        <TextView android:id="@+id/example_item_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"/>

        <TextView android:id="@+id/example_item_level_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold|italic"
                android:lines="1"
                android:textSize="10px"/>
    </LinearLayout>

    <TextView android:id="@+id/example_item_count_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textSize="14px"/>
</LinearLayout>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接