RelativeLayout mengambil layar penuh untuk wrap_content

126

Mengapa FOOBARZ diletakkan di bawah ketika tidak ada elemen layout_height="fill_parent"dengan kata lain, semua elemen wrap_content untuk tinggi? masukkan deskripsi gambar di sini

<?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>
hunterp
sumber
1
Gunakan hierarchyvieweratau perspektif Hierarchy View di Eclipse untuk menentukan di mana ada masalah: developer.android.com/guide/developing/debugging/…
CommonsWare
Di mana perspektif tampilan hierarki di dalam gerhana? layar yang mana?
hunterp
1
Jendela> Buka Perspektif> Lainnya ... - meskipun saya pikir Anda sudah memiliki jawaban, milik @alextc.
CommonsWare
@CommonsWare Saya sudah menemukannya, tapi itu kosong, bagaimana saya bisa benar-benar memuat tata letak ke dalamnya ??
hunterp

Jawaban:

266

Dari RelativeLayoutdokumen:

Tinjauan Kelas

Layout di mana posisi anak-anak dapat dijelaskan dalam hubungannya satu sama lain atau dengan orang tua.

Perhatikan bahwa Anda tidak dapat memiliki ketergantungan melingkar antara ukuran RelativeLayout dan posisi anak-anaknya. Misalnya, Anda tidak dapat memiliki RelativeLayout yang tingginya diatur ke WRAP_CONTENT dan anak kecil diatur ke ALIGN_PARENT_BOTTOM

Dokumentasi kelas

Yang persis seperti Anda. RelativeLayout tidak bisa melakukan itu.

Komunitas
sumber
3
Jadi saya menghapus align_parentBottom dan tata letak sekarang hanya 1/10 layar sebagaimana mestinya, bagaimana saya bisa meletakkan FOOBARZ di bagian bawah ini?
hunterp
2
Hanya dengan melihat sekilas, saya akan mengatakan: Ambil tampilan teks FOOBARZ, pindahkan ke bagian luar RelativeLayout dan atur android: layout_below = "@ id / feed_u". Saya tidak yakin apakah ini yang Anda inginkan tangguh.
Sudahkah Anda mencoba menetapkan ketinggian tetap ke tata letak relatif (mis android:layout_height="200dp". Ini akan memungkinkan Anda untuk menggunakanandroid:layout_alignParentBottom="true"
gfrigon
1
Perhatikan bahwa ini juga bisa terjadi ketika menggunakan drawable besar sebagai latar belakang. Untuk menyiasatinya, tarik konten utama ke tata letak anak, dan jadikan latar belakang saudara <ImageView>yang berada di belakangnya.
Ben Leggiero
1
Aku melihat bahwa anak-anak juga tidak diperbolehkan untuk menggunakan layout_heightdarimatch_parent
Daniel F
52

Bagi mereka yang mencari solusi untuk ini, seperti yang saya lakukan, Anda dapat menggunakan FrameLayoutbukan RelativeLayout.

Kemudian Anda dapat mengatur gravitasi objek yang dimaksud ke kanan bawah seperti di bawah ini

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>
Muz
sumber
Menggunakan FrameLayout adalah solusi hebat. Jika Anda memiliki lebih banyak komponen dalam tata letak ini, Anda harus mengatur margin untuk menghindari tumpang tindih.
Veronnie
23

Anda telah mengatur RelativeLayout ke "wrap_content" dan TextView ke android:layout_alignParentBottom="true", sehingga secara otomatis mencoba untuk meregangkan RelativeLayout ke bawah. Jangan gunakan dependensi seperti itu dengan Layout Relatif, karena dapat dihitung sebagai "dependensi melingkar".

Dari dokumen untuk RelativeLayout :

Perhatikan bahwa Anda tidak dapat memiliki ketergantungan melingkar antara ukuran RelativeLayout dan posisi anak-anaknya. Misalnya, Anda tidak dapat memiliki RelativeLayout yang tingginya diatur ke WRAP_CONTENTdan anak diatur ke ALIGN_PARENT_BOTTOM.

Cobalah untuk menyelaraskan TextView Anda dengan sesuatu selain dari induk RelativeLayout, tetapi perhatikan juga masalah ini:
Ketergantungan melingkar, butuh bantuan dengan kode yang tepat

Atau, cobalah menambahkan tata ruang bagian dalam yang lebih canggih.

Dirol
sumber
2
By the way, saya pikir saat runtime - kode Anda akan ditampilkan seperti yang Anda inginkan, bahkan dengan "android: layout_alignParentBottom =" true "". Tampaknya, Android melakukan beberapa penguraian tambahan pada kasus ini saat runtime dan menampilkannya dengan benar. Anda harus mencoba menjalankan aplikasi Anda.
Dirol
0

Jawaban yang bagus Sekarang jika Anda tidak memiliki layout_alignParentBottom="true"dan masih mendapatkan masalah ini hati-hati di android:background="@drawable/bkgnd"mana bkgnd adalah masalah besar.

Kellogs
sumber
0

Saya tidak yakin mengapa cara yang jelas dan bersih untuk mencapai ini belum diposting. Solusi berkinerja ini berfungsi untuk Tampilan MyView apa pun dengan ketinggian yang diketahui.

Bungkus Anda RelativeLayoutdengan tinggi wrap_contentdalam 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>

Harap perhatikan bahwa tampilan di bagian bawah FrameLayout akan berada di atas RelativeLayoutkonten Anda , jadi Anda harus menambahkan bantalan ke bagian bawah tata letak itu untuk mengakomodasi itu. Jika Anda ingin tampilan itu menjadi variabel tinggi, Anda bisa Subclass FrameLayout untuk menambahkan padding dalam kode berdasarkan ketinggian tampilan yang diukur, atau hanya mengubah FrameLayout ke LinearLayout vertikal jika Anda tidak khawatir tentang kinerja, yaitu itu bukan listview item, atau tampilan yang relatif ringan.

Johnny C
sumber
0

Jangan gunakan properti jenis alight_Parent dengan tampilan anak

Anda dapat menggunakan tata letak bingkai alih-alih RelativeLayout dengan gravitasi masing-masing

    <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>
Amit Pathak
sumber