Android: bagaimana cara membuat tampilan berkembang untuk mengisi ruang yang tersedia?

90

Ini tampaknya mudah, tetapi saya tidak tahu bagaimana melakukannya. Saya memiliki tata letak horizontal dengan EditText dan dua ImageButtons. Saya ingin ImageButtons berukuran tetap, dan EditText mengambil ruang yang tersisa di layout. Bagaimana ini bisa dicapai?

<LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content">
        <EditText 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </EditText>
        <ImageButton 
            android:src="@drawable/img1"
            android:layout_width="50dip" 
            android:layout_height="50dip">
        </ImageButton>
        <ImageButton 
            android:src="@drawable/img2"
            android:layout_width="50dip" 
            android:layout_height="50dip">
        </ImageButton>
</LinearLayout>
ab11
sumber

Jawaban:

51

coba ini dalam tata letak relatif

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">
    <ImageButton 
        android:id="@+id/btn1"
        android:src="@drawable/icon"
        android:layout_width="50dip" 
        android:layout_height="50dip"
        android:layout_alignParentRight="true"/>
    <ImageButton 
        android:id="@+id/btn2"
        android:src="@drawable/icon"
        android:layout_width="50dip" 
        android:layout_height="50dip"
        android:layout_toLeftOf="@+id/btn1"/>
    <EditText 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btn2">
    </EditText>

</RelativeLayout>
Sunil Pandey
sumber
4
Terima kasih. Ini bekerja dengan baik. (Kecuali bahwa ImageButtons harus didefinisikan sebelum EditText, seperti yang dicatat Joseph).
ab11
1
fill_parent - Konstanta ini tidak digunakan lagi mulai dari API Level 8 dan diganti dengan {@code match_parent}.
Zon
147

Jika Anda ingin menjaga tata letak tetap sama (yaitu, tombol setelah teks), gunakan layout_weightproperti, bersama dengan fill_parent, sebagai berikut:

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">
    <EditText 
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </EditText>
    <ImageButton 
        android:src="@drawable/img1"
        android:layout_width="50dip" 
        android:layout_height="50dip">
    </ImageButton>
    <ImageButton 
        android:src="@drawable/img2"
        android:layout_width="50dip" 
        android:layout_height="50dip">
    </ImageButton>
 </LinearLayout>

Memberi EditText'bobot' membuatnya dipikirkan terakhir dan mendahulukan tombol. Bermainlah dengan layout_weights yang berbeda dan lihat betapa menyenangkannya Anda!

Jonathan
sumber
1
Terima kasih. Saya memiliki tata letak 3 area (header, konten- WebView dan footer), ini memecahkan masalah dengan menyetel WebView layout_weight = 1 dan footer layout_weight = 0.
MKK
Tidak tahu triknya dengan mengatur berat badan dan 0dp hanya untuk satu anak .. Terima kasih!
Marcel Bro
1
apakah ini umumnya dianggap sebagai praktik terbaik? Sangat menarik bahwa Anda dapat memengaruhi urutan Android menyelesaikan tampilan.
Cypress Frankenfeld
2
lebar harus dijaga 0 Saya pikir
Bibaswann Bandyopadhyay
19

Baik:

<RelativeLayout 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content">

        <ImageButton 
            android:id="@+id/button1"
            android:src="@drawable/img1"
            android:layout_width="50dip"
            android:layout_alignParentTop="true" 
            android:layout_height="50dip">
        </ImageButton>
        <ImageButton 
            android:src="@drawable/img2"
            android:layout_width="50dip" 
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@id/button1"
            android:layout_height="50dip">
        </ImageButton>
        <EditText 
            android:layout_below="@id/button"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent">
        </EditText>
</RelativeLayout>

Poin utama dari tata letak adalah:

  • Item dengan ukuran tetap ditempatkan pertama dalam tata letak, dengan cara ini ketika Android datang untuk menghitung ketinggian dari benda-benda dengan fill_parentnanti di file itu hanya memperhitungkan ruang yang tersisa, tidak semua ruang yang mungkin dapat ditempati jika tidak ada yang lain di sana
  • EditText memiliki tinggi fill_parent( match_parentdalam 2.2+) sehingga menempati sisa ruang yang tersedia

Maaf tidak membaca pertanyaan Anda sudah cukup. Kode di atas memberikan jawaban jika Anda ingin melakukannya secara vertikal. Untuk tata letak horizontal, kode yang diposting oleh @Sunil harus berfungsi.

Joseph Earl
sumber
Terima kasih Joseph. Ini berhasil. Padahal, saya memuji Sunil karena sedikit lebih cepat.
ab11
13

Gunakan setel layout_widthatau layout_heightke 0dp(Dengan orientasi yang Anda inginkan untuk mengisi ruang yang tersisa). Kemudian gunakan layout_weightuntuk membuatnya mengisi ruang yang tersisa.

taynguyen
sumber