2011-05-04 37 views
21

Tôi đã có một relativelayout với ba linearlayouts như trẻ em. Người cuối cùng có chiều cao cố định và có android: layout_alignParentBottom được đặt thành "true". Trong khi cái ở giữa được đặt đúng vị trí bên dưới cái đầu tiên, nó đi xa đến tận đáy màn hình, sao cho phần dưới của nó bị chồng chéo bởi phần thứ ba.Làm thế nào để làm cho một linearlayout lấp đầy không gian còn lại trong một relativelayout?

Có vấn đề gì?

Cảm ơn

<?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> 
+0

vì vậy bạn muốn gì? – ingsaurabh

Trả lời

11

Nooo ... là giải pháp đơn giản hơn nhiều! Bạn quên nói rằng bạn muốn nói bố cục tuyến tính thứ hai phải ở trên vị trí thứ ba :) Có, bố cục tuyến tính thứ hai phải có BOTH android:layout_below="@+id/category"android:layout_above="@+id/nav_bar". Tôi đã thử nghiệm nó và nó hoạt động.

Nhưng tất nhiên, bạn có thể sử dụng trọng lượng để lưu trữ các kết quả tương tự, nó chỉ sẽ khó khăn hơn ...

XML của bạn với sự thay đổi tôi đã đề cập (thử nghiệm nó trong nhật thực):

<?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> 
31

Bạn có thể thử sử dụng trọng số bố cục để kiểm soát các kích thước tương đối của các bố trí con. Có một số article on my blog cung cấp một số thông tin về việc sử dụng trọng số bố cục.

Như một ví dụ, hãy thử này:

<?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> 

Các RelativeLayout đã được thay thế bởi một LinearLayout, tất cả các thẻ định vị tương đối đã được loại bỏ, và một thuộc tính layout_weight đã được thêm vào trung tâm LinearLayout mà sẽ làm cho nó căng ra để lấp đầy không gian có sẵn.

1

Bạn nên thêm một id để LinearLayout thứ hai của bạn

<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/YOUR_ID> 

và trong cách bố trí thứ ba thêm android:[email protected]/YOUR_ID

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

Chỉ cần thêm vào điều này, tại sao LinearLayout thứ 3 cũng khai báo thẻ xmlns: android? Tôi nghĩ bạn chỉ làm điều đó trong đối tượng gốc? – Klaus

+0

Không thấy điều đó :) Chỉ cần tạo một bản sao/dán, nhưng bạn đã đúng. Nó đang làm gì ở đó? – Bastaix

Các vấn đề liên quan