如何使linearlayout填充相对布局中的剩余空间?

时间:2011-05-04 08:18:26

标签: android layout

我有一个相对布局,有3个线性布局作为孩子。最后一个具有固定的高度,并将android:layout_alignParentBottom设置为“true”。虽然中间的一个正确位于第一个下面,但它一直到屏幕的底部,因此它的下半部分与第三个重叠。

怎么了?

由于

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:id="@+id/category"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentTop="true"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/back_btn"
            android:layout_width="29dp"
            android:layout_height="34dp"
            android:layout_gravity="center_vertical"
            android:src="@drawable/red_arrow_left" />

        <TextView
            android:id="@+id/cat_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="center"
            android:textSize="20sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/category"
        android:layout_marginTop="10dp"
        android:orientation="horizontal" >

        <ListView
            android:id="@+id/android:list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@android:color/white"
            android:cacheColorHint="@android:color/white" />

        <TextView
            android:id="@+id/android:empty"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@android:color/white"
            android:cacheColorHint="@android:color/white"
            android:padding="10dp"
            android:text="@string/no_item" />
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/nav_bar"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >
    //stuff

    </LinearLayout>
</RelativeLayout>

3 个答案:

答案 0 :(得分:33)

您可以尝试使用布局权重来控制子布局的相对大小。有一个article on my blog可以提供有关布局权重使用的一些信息。

举个例子,试试这个:

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

    <LinearLayout
        android:id="@+id/category"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/back_btn"
            android:layout_width="29dp"
            android:layout_height="34dp"
            android:layout_gravity="center_vertical" />

        <TextView
            android:id="@+id/cat_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="center"
            android:textSize="20sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/category"
        android:layout_marginTop="10dp"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <ListView
            android:id="@+id/android:list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@android:color/white"
            android:cacheColorHint="@android:color/white" />

        <TextView
            android:id="@+id/android:empty"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@android:color/white"
            android:cacheColorHint="@android:color/white"
            android:padding="10dp"
            android:text="no_item" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/nav_bar"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:orientation="horizontal" >
    //stuff

    </LinearLayout>
</LinearLayout>

RelativeLayout已替换为LinearLayout,所有相对定位标记均已移除,layout_weight属性已添加到中心LinearLayout会使它伸展以填充可用空间。

答案 1 :(得分:12)

Nooo ......解决方案更简单!你忘了说你想说第二个线性布局应该高于第三个线性布局:)是的,第二个线性布局必须有两个android:layout_below="@+id/category"android:layout_above="@+id/nav_bar"。我测试了它并且它有效。

但是,当然,您可以使用权重来存档相同的结果,这只会更难......

您的XML与我提到的更改(在eclipse中测试):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:id="@+id/category"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentTop="true"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/back_btn"
            android:layout_width="29dp"
            android:layout_height="34dp"
            android:layout_gravity="center_vertical"
            android:src="@drawable/red_arrow_left" />

        <TextView
            android:id="@+id/cat_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="center"
            android:textSize="20sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/nav_bar"
        android:layout_below="@+id/category"
        android:layout_marginTop="10dp"
        android:orientation="horizontal" >

        <ListView
            android:id="@+id/android:list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@android:color/white"
            android:cacheColorHint="@android:color/white" />

        <TextView
            android:id="@+id/android:empty"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@android:color/white"
            android:cacheColorHint="@android:color/white"
            android:padding="10dp"
            android:text="@string/no_item" />
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/nav_bar"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >
//stuff

    </LinearLayout>
</RelativeLayout>

答案 2 :(得分:1)

您应该为第二个LinearLayout添加ID

    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"        
        android:layout_below="@+id/category" 
        android:layout_marginTop="10dp"
        android:id="@+id/YOUR_ID">

并在第三个布局中添加android:layout_below="@id/YOUR_ID"

   <LinearLayout 
       android:id="@+id/nav_bar"
       android:layout_below="@id/YOUR_ID"
       android:orientation="horizontal" 
       android:layout_width="fill_parent"        
       android:layout_height="40dp" 
       android:layout_alignParentBottom="true">