RelativeLayout đang dùng toàn màn hình cho quấn_content


126

Tại sao FOOebarZ được bố trí hết cỡ ở phía dưới khi không có yếu tố nào layout_height="fill_parent"trong các từ khác, tất cả các yếu tố được quấn_content cho chiều cao? nhập mô tả hình ảnh ở đây

<?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="wrap_content">
    <TextView
        android:id="@+id/feed_u"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:layout_marginLeft="5dip"
        android:scaleType="centerCrop"
        android:drawableTop="@android:drawable/presence_online"
        android:text="U" />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/feed_u">
        <ImageView
            android:id="@+id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_minus" />
        <ImageView
            android:id="@+id/feed_ha"
            android:layout_toLeftOf="@id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_plus" />
        <TextView
            android:id="@+id/feed_t"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Title">
        </TextView>
        <TextView
            android:id="@+id/feed_a"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Band"
            android:layout_below="@id/feed_t">
        </TextView>
        <TextView
            android:id="@+id/feed_s"
            android:layout_below="@id/feed_a"
            android:text="S"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>
        <TextView
            android:id="@+id/feed_tm"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="FOOBARZ"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>

    </RelativeLayout>
</RelativeLayout>

1
Sử dụng hierarchyviewerhoặc phối cảnh Khung nhìn phân cấp trong Eclipse để xác định nơi mọi thứ sẽ sai: developer.android.com/guide/developing/debugging/
mẹo

Đâu là góc nhìn thứ bậc trong nhật thực? màn hình nào
thợ săn

1
Cửa sổ> Mở phối cảnh> Khác ... - mặc dù tôi nghĩ rằng bạn đã có câu trả lời của mình, nhờ vào @alextc.
CommonsWare

@CommonsWare Tôi đã tìm thấy nó, nhưng nó trống, làm thế nào tôi thực sự có thể tải một bố cục vào nó ??
thợ săn

Câu trả lời:


266

Từ RelativeLayouttài liệu:

Tổng quan về lớp học

Một bố cục trong đó các vị trí của trẻ em có thể được mô tả trong mối quan hệ với nhau hoặc với cha mẹ.

Lưu ý rằng bạn không thể có sự phụ thuộc vòng tròn giữa kích thước của RelativeLayout và vị trí của các con của nó. Ví dụ: bạn không thể có RelativeLayout có chiều cao được đặt thành WRAP_CONTENT và một đứa trẻ được đặt thành ALIGN_PARENT_BOTTOM

Tài liệu lớp

Đó chính xác là trường hợp của bạn. RelativeLayout không thể làm điều đó.


3
Vì vậy, tôi đã loại bỏ align_parentBottom và bố cục bây giờ chỉ bằng 1/10 màn hình, làm thế nào tôi có thể đặt FOOebarZ ở dưới cùng của điều này?
thợ săn

2
Chỉ bằng cách xem qua, tôi sẽ nói: Lấy textview FOOebarZ, di chuyển nó đến RelativeLayout bên ngoài và đặt android: layout_below = "@ id / feed_u". Tôi không chắc chắn chính xác nếu đây là những gì bạn muốn khó khăn.

Bạn đã thử gán một chiều cao cố định cho bố cục tương đối (ví dụ: android:layout_height="200dp"Điều này sẽ cho phép bạn sử dụngandroid:layout_alignParentBottom="true"
gfrigon

1
Lưu ý rằng điều này cũng có thể xảy ra khi sử dụng một drawable lớn làm nền. Để giải quyết vấn đề này, hãy kéo nội dung chính ra thành bố cục con và tạo hậu cảnh cho anh chị em <ImageView>đằng sau nó.
Ben Leggiero

1
Tôi nhận thấy rằng những đứa trẻ cũng không được phép sử dụng một layout_heightsốmatch_parent
Daniel F

52

Đối với những người tìm kiếm một giải pháp cho vấn đề này, như tôi đã làm, bạn có thể sử dụng FrameLayoutthay vì RelativeLayout.

Sau đó, bạn có thể đặt trọng lực của đối tượng dự định xuống dưới cùng bên phải như bên dưới

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>

Sử dụng FrameLayout là giải pháp tuyệt vời. Nếu bạn có nhiều thành phần hơn trong bố cục này, bạn phải đặt lề để tránh chồng chéo.
Veronnie

23

Bạn đã đặt RelativeLayout thành "wrap_content" và TextView thành android:layout_alignParentBottom="true", để nó tự động cố gắng kéo RelativeLayout xuống phía dưới. Không sử dụng các phụ thuộc như vậy với Bố cục tương đối, vì nó có thể được tính là "phụ thuộc vòng tròn".

Từ các tài liệu cho RelativeLayout :

Lưu ý rằng bạn không thể có sự phụ thuộc vòng tròn giữa kích thước của RelativeLayout và vị trí của các con của nó. Ví dụ: bạn không thể có RelativeLayout có chiều cao được đặt thành WRAP_CONTENTvà một con được đặt thành ALIGN_PARENT_BOTTOM.

Cố gắng căn chỉnh TextView của bạn với một cái gì đó không phải là RelativeLayout gốc, nhưng cũng coi chừng vấn đề này:
Phụ thuộc tròn, cần một số trợ giúp với mã chính xác

Ngoài ra, hãy cố gắng thêm bố cục bên trong tinh vi hơn.


2
Nhân tiện, tôi nghĩ trong thời gian chạy - mã của bạn sẽ được hiển thị như bạn muốn, ngay cả với "android: layout_alignParentBottom =" true "". Dường như, Android thực hiện một số phân tích bổ sung về trường hợp này trong thời gian chạy và hiển thị chính xác. Bạn nên cố gắng chạy ứng dụng của bạn.
Dirol

0

Câu trả lời tốt. Bây giờ nếu bạn không có layout_alignParentBottom="true"và vẫn gặp phải vấn đề này, hãy coi chừng android:background="@drawable/bkgnd"bkgnd là một vấn đề lớn .


0

Tôi không chắc tại sao cách hoàn thành rõ ràng và rõ ràng này chưa được đăng. Giải pháp hiệu suất này hoạt động cho mọi View MyView có chiều cao đã biết.

Bao bọc RelativeLayoutchiều cao của bạn wrap_contenttrong FrameLayout:

<!-- width here should constrain RelativeLayout -->
<FrameLayout 
     android:layout_width="@dimen/my_layout_width"
     android:layout_height="wrap_content">

     <RelativeLayout  
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />

     <MyView
        ...
        android:layout_gravity="bottom" />
</FrameLayout>

Chỉ cần lưu ý rằng chế độ xem ở cuối FrameLayout sẽ ở trên cùng RelativeLayoutnội dung của bạn , vì vậy bạn sẽ cần thêm phần đệm vào cuối bố cục đó để chứa nội dung đó. Nếu bạn muốn chế độ xem đó là chiều cao thay đổi, bạn có thể Phân lớp FrameLayout để thêm phần đệm trong mã dựa trên chiều cao của chế độ xem được đo hoặc chỉ thay đổi FrameLayout thành linearLayout dọc nếu bạn không lo lắng về hiệu suất, nghĩa là nó không phải là một chế độ xem mục, hoặc quan điểm là tương đối nhẹ.


0

Không sử dụng thuộc tính loại alight_Parent với chế độ xem con

Bạn có thể sử dụng bố cục khung thay vì RelativeLayout với trọng lực tương ứng

    <FrameLayout
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
     <TextView
        android:layout_gravity="bottom|right"
        android:text="Hello "
        android:layout_height="wrap_content"
        android:layout_width="wrap_content">

    </TextView>

</FrameLayout>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.