RelativeLayout ใช้แบบเต็มหน้าจอสำหรับ wrap_content


126

เหตุใด FOOBARZ จึงถูกจัดวางไว้ด้านล่างสุดเมื่อไม่มีองค์ประกอบกล่าวlayout_height="fill_parent"อีกนัยหนึ่งองค์ประกอบทั้งหมดเป็น wrap_content สำหรับความสูง ใส่คำอธิบายภาพที่นี่

<?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
ใช้hierarchyviewerหรือมุมมอง Hierarchy View ใน Eclipse เพื่อพิจารณาว่าเกิดอะไรขึ้นบ้าง: developer.android.com/guide/developing/debugging/…
CommonsWare

มุมมองมุมมองลำดับชั้นภายในคราสอยู่ที่ไหน หน้าจอไหน?
hunterp

1
หน้าต่าง> เปิดมุมมอง> อื่น ๆ ... - แม้ว่าฉันคิดว่าคุณมีคำตอบอยู่แล้ว แต่ได้รับความอนุเคราะห์จาก @alextc
CommonsWare

@CommonsWare ฉันเจอ แต่มันว่างเปล่าฉันจะโหลดเลย์เอาต์ลงไปได้อย่างไร ??
hunterp

คำตอบ:


266

จากRelativeLayoutเอกสาร:

ภาพรวมของชั้นเรียน

เค้าโครงที่สามารถอธิบายตำแหน่งของเด็กที่สัมพันธ์กันหรือกับผู้ปกครอง

โปรดทราบว่าคุณไม่สามารถมีการพึ่งพาแบบวงกลมระหว่างขนาดของ RelativeLayout และตำแหน่งของลูกได้ ตัวอย่างเช่นคุณไม่สามารถมี RelativeLayout ซึ่งตั้งค่าความสูงเป็น WRAP_CONTENT และชุดลูกเป็น ALIGN_PARENT_BOTTOM

เอกสารประกอบการเรียน

ซึ่งตรงกับกรณีของคุณ RelativeLayout ไม่สามารถทำได้


3
ดังนั้นฉันจึงลบ align_parentBottom ออกและตอนนี้เค้าโครงเป็นเพียง 1/10 ของหน้าจอตามที่ควรจะเป็นฉันจะวาง FOOBARZ ไว้ที่ด้านล่างของสิ่งนี้ได้อย่างไร
hunterp

2
เพียงแค่ดูสั้น ๆ ฉันจะบอกว่า: ใช้ FOOBARZ textview ย้ายไปที่ RelativeLayout ด้านนอกแล้วตั้งค่า android: layout_below = "@ id / feed_u" ฉันไม่แน่ใจว่านี่คือสิ่งที่คุณต้องการหรือไม่

คุณได้ลองกำหนดความสูงคงที่ให้กับเลย์เอาต์สัมพัทธ์หรือไม่ (เช่นandroid:layout_height="200dp"สิ่งนี้จะช่วยให้คุณใช้android:layout_alignParentBottom="true"
gfrigon

1
โปรดทราบว่าสิ่งนี้อาจเกิดขึ้นได้เมื่อใช้ภาพวาดขนาดใหญ่เป็นพื้นหลัง หากต้องการหลีกเลี่ยงให้ดึงเนื้อหาหลักออกมาเป็นเค้าโครงย่อยและทำให้พื้นหลังเป็นพี่น้อง<ImageView>ที่อยู่เบื้องหลัง
Ben Leggiero

1
ผมสังเกตเห็นว่าเด็กจะยังไม่ได้รับอนุญาตให้ใช้layout_heightของmatch_parent
แดเนียลเรนไฮน์

53

สำหรับผู้ที่กำลังมองหาวิธีแก้ปัญหานี้เช่นเดียวกับฉันคุณสามารถใช้FrameLayoutแทนRelativeLayout.

จากนั้นคุณสามารถตั้งค่าแรงโน้มถ่วงของวัตถุที่ต้องการไว้ที่ด้านล่างขวาดังต่อไปนี้

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

ใช้ FrameLayout เป็นทางออกที่ดี หากคุณมีองค์ประกอบเพิ่มเติมในเค้าโครงนี้คุณต้องตั้งค่าระยะขอบเพื่อหลีกเลี่ยงการทับซ้อนกัน
Veronnie

23

คุณได้ตั้งค่า RelativeLayout เป็น"wrap_content" และ TextView เป็นandroid:layout_alignParentBottom="true"ดังนั้นจะพยายามยืด RelativeLayout ไปที่ด้านล่างโดยอัตโนมัติ อย่าใช้การอ้างอิงดังกล่าวกับ Relative Layout เนื่องจากสามารถนับเป็น "การอ้างอิงแบบวงกลม" ได้

จากเอกสารสำหรับ RelativeLayout :

โปรดทราบว่าคุณไม่สามารถมีการพึ่งพาแบบวงกลมระหว่างขนาดของ RelativeLayout และตำแหน่งของลูกได้ ตัวอย่างเช่นคุณไม่สามารถมี RelativeLayout ที่มีความสูงถูกตั้งและชุดเด็กWRAP_CONTENTALIGN_PARENT_BOTTOM

พยายามจัดแนว TextView ของคุณให้ตรงกับสิ่งอื่นที่ไม่ใช่ RelativeLayout หลัก แต่ระวังปัญหานี้ด้วยเช่นกัน: การ
อ้างอิงแบบวงกลมต้องการความช่วยเหลือเกี่ยวกับรหัสที่แน่นอน

หรือลองเพิ่มเค้าโครงภายในที่ซับซ้อนมากขึ้น


2
อย่างไรก็ตามฉันคิดว่าที่รันไทม์ - รหัสของคุณจะแสดงตามที่คุณต้องการแม้ว่าจะมี "android: layout_alignParentBottom =" true "" ก็ตาม ดูเหมือนว่า Android จะทำการแยกวิเคราะห์เพิ่มเติมในกรณีนี้ที่รันไทม์และแสดงอย่างถูกต้อง คุณควรพยายามเรียกใช้แอปของคุณ
Dirol

0

คำตอบที่ดี ตอนนี้หากคุณยังไม่มีlayout_alignParentBottom="true"และยังคงได้รับปัญหานี้ให้ระวังandroid:background="@drawable/bkgnd"จุดที่ bkgnd เป็นเรื่องใหญ่


0

ฉันไม่แน่ใจว่าทำไมถึงยังไม่มีการโพสต์วิธีการที่สะอาดและชัดเจน โซลูชันที่มีประสิทธิภาพนี้ใช้ได้กับ View MyView ที่มีความสูงที่ทราบ

ห่อของคุณRelativeLayoutด้วยความสูงwrap_contentใน 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>

โปรดทราบว่ามุมมองที่ด้านล่างของ FrameLayout จะอยู่ด้านบนของRelativeLayoutเนื้อหาของคุณดังนั้นคุณจะต้องเพิ่มช่องว่างที่ด้านล่างของเลย์เอาต์นั้นเพื่อรองรับ หากคุณต้องการให้มุมมองนั้นมีความสูงที่แตกต่างกันคุณสามารถ Subclass FrameLayout เพื่อเพิ่มช่องว่างภายในโค้ดตามความสูงของมุมมองที่วัดได้หรือเพียงแค่เปลี่ยน FrameLayout เป็น LinearLayout แนวตั้งหากคุณไม่กังวลเกี่ยวกับประสิทธิภาพนั่นคือไม่ใช่มุมมองรายการ รายการหรือจำนวนการดูมีน้ำหนักเบา


0

อย่าใช้คุณสมบัติประเภท alight_Parent กับมุมมองลูก

คุณสามารถใช้เค้าโครงเฟรมแทน RelativeLayout ด้วยแรงโน้มถ่วงตามลำดับ

    <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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.