Ini kode tata letak saya;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>
<LinearLayout android:id="@+id/LinearLayout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom">
<EditText android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</EditText>
<Button android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
</LinearLayout>
Seperti apa ini di sebelah kiri dan apa yang saya inginkan di sebelah kanan.
Jawaban yang jelas adalah untuk mengatur TextView ke fill_parent pada ketinggian, tetapi ini menyebabkan tidak ada ruang yang tersisa untuk tombol atau bidang entri.
Pada dasarnya masalahnya adalah bahwa saya ingin tombol kirim dan entri teks menjadi ketinggian tetap di bagian bawah dan tampilan teks untuk mengisi sisa ruang. Demikian pula, dalam tata letak linier horizontal saya ingin tombol kirim untuk membungkus kontennya dan untuk entri teks untuk mengisi sisa ruang.
Jika item pertama dalam tata letak linier diperintahkan untuk fill_parent itu melakukan hal itu, tidak meninggalkan ruang untuk item lain. Bagaimana cara mendapatkan item yang pertama dalam tata letak linier untuk mengisi semua ruang selain dari minimum yang diperlukan oleh sisa item dalam tata letak?
Layout relatif memang jawabannya:
<?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">
<TextView
android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true">
</TextView>
<RelativeLayout
android:id="@+id/InnerRelativeLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<Button
android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
<EditText
android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_toLeftOf="@id/Button"
android:layout_height="wrap_content">
</EditText>
</RelativeLayout>
</RelativeLayout>
Jawaban:
Cara modern untuk melakukan ini adalah memiliki ConstraintLayout dan membatasi bagian bawah tampilan ke bagian bawah ConstraintLayout dengan
app:layout_constraintBottom_toBottomOf="parent"
Contoh di bawah ini membuat FloatingActionButton yang akan diselaraskan dengan ujung dan bagian bawah layar.
Sebagai referensi, saya akan menyimpan jawaban lama saya.
Sebelum pengenalan ConstraintLayout jawabannya adalah tata letak yang relatif .
Jika Anda memiliki tata letak relatif yang memenuhi seluruh layar, Anda seharusnya dapat menggunakannya
android:layout_alignParentBottom
untuk memindahkan tombol ke bagian bawah layar.Jika tampilan Anda di bagian bawah tidak ditampilkan dalam tata letak relatif maka mungkin tata letak di atas ini membutuhkan semua ruang. Dalam hal ini Anda dapat menempatkan tampilan, yang harus di bagian bawah, pertama di file tata letak Anda dan posisikan sisa tata letak di atas tampilan dengan
android:layout_above
. Ini memungkinkan tampilan bawah untuk mengambil ruang sebanyak yang dibutuhkan, dan tata letak lainnya dapat mengisi semua sisa layar.sumber
android:layout_above
?that RelativeLayout
yang menghabiskan banyak memori dan harus dihindari kapan pun memungkinkan.Dalam
ScrollView
hal ini tidak berfungsi, karenaRelativeLayout
akan tumpang tindih dengan apa pun yang ada diScrollView
bagian bawah halaman.Saya memperbaikinya menggunakan peregangan dinamis
FrameLayout
:sumber
Anda dapat mempertahankan tata letak linier awal Anda dengan menumpuk tata letak relatif dalam tata letak linier:
sumber
Jawaban di atas (oleh Janusz) cukup benar, tetapi secara pribadi saya tidak merasa 100% nyaman dengan RelativeLayouts, jadi saya lebih suka memperkenalkan 'filler', kosong TextView, seperti ini:
sebelum elemen yang harus di bagian bawah layar.
sumber
Anda dapat melakukannya dengan LinearLayout atau ScrollView juga. Terkadang lebih mudah diterapkan daripada RelativeLayout. Satu-satunya hal yang perlu Anda lakukan adalah menambahkan tampilan berikut sebelum Tampilan yang ingin Anda selaraskan ke bagian bawah layar:
Ini menciptakan tampilan kosong, mengisi ruang kosong dan mendorong tampilan berikutnya ke bagian bawah layar.
sumber
Ini juga berfungsi.
sumber
1. Gunakan
ConstraintLayout
di Layout root AndaDan atur
app:layout_constraintBottom_toBottomOf="parent"
untuk membiarkan Tata Letak di bagian bawah layar:2. Gunakan
FrameLayout
di Layout root AndaCukup atur
android:layout_gravity="bottom"
di tata letak Anda3. Gunakan
LinearLayout
di Layout root Anda (android:orientation="vertical"
)(1) Atur tata letak
android:layout_weight="1"
di bagian atas Tata Letak Anda(2) Tetapkan anak
LinearLayout
untukandroid:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"
Atribut utamanya adalah
ndroid:gravity="bottom"
, biarkan anak Lihat di bagian bawah Layout.4. Gunakan
RelativeLayout
di Layout rootDan atur
android:layout_alignParentBottom="true"
untuk membiarkan Layout di bagian bawah layarKeluaran
sumber
Menindaklanjuti solusi elegan Timores , saya telah menemukan bahwa yang berikut ini membuat isian vertikal dalam LinearLayout vertikal dan isian horizontal dalam LinearLayout horizontal:
sumber
Anda bahkan tidak perlu membuat
relative
layout tata letak kedua di dalam yang pertama. Cukup gunakanandroid:layout_alignParentBottom="true"
di Button dan EditText .sumber
Jika Anda tidak ingin membuat banyak perubahan, maka Anda bisa memasukkan:
untuk TextView memiliki ID sebagai
@+id/TextView
missumber
Membuat header dan footer , berikut adalah contohnya:
Layout XML
Tangkapan layar
sumber
Gunakan kode di bawah ini. Sejajarkan tombol untuk buttom. Bekerja.
sumber
Untuk kasus seperti ini, selalu gunakan RelativeLayouts. LinearLayout tidak dimaksudkan untuk penggunaan seperti itu.
sumber
Gunakan
android:layout_alignParentBottom="true"
di<RelativeLayout>
.Ini pasti akan membantu.
sumber
Jika Anda memiliki hierarki seperti ini:
Pertama, terapkan
android:fillViewport="true"
keScrollView
dan kemudian terapkanandroid:layout_alignParentBottom="true"
keLinearLayout
.Ini bekerja dengan baik untuk saya.
sumber
Anda hanya bisa memberikan Anda pandangan anak atas (TextView @ + id / TextView ) atribut:
android:layout_weight="1"
.Ini akan memaksa semua elemen lain di bawahnya ke bawah.
sumber
Ini dapat dilakukan dengan tata letak linier juga.
Cukup berikan Tinggi = 0dp dan berat = 1 ke tata letak di atas dan yang Anda inginkan di bagian bawah. Cukup tulis tinggi = bungkus konten dan tanpa berat.
Ini memberikan bungkus konten untuk tata letak (yang berisi teks dan tombol edit Anda) dan kemudian yang memiliki berat menempati sisa tata letak.
Saya menemukan ini secara tidak sengaja.
sumber
Saya menggunakan solusi yang diposting Janusz, tetapi saya menambahkan padding ke tampilan terakhir karena bagian atas tata letak saya adalah ScrollView.
ScrollView akan disembunyikan sebagian karena bertambah dengan konten. Menggunakan
android:paddingBottom
pada Tampilan terakhir membantu menampilkan semua konten di ScrollView.sumber