Saya sedang mengerjakan tata letak formulir untuk Login Activity
di Aplikasi Android saya. Gambar di bawah ini adalah bagaimana saya ingin terlihat seperti:
Saya dapat mencapai tata letak ini dengan XML berikut . Masalahnya adalah, ini sedikit meretas. Saya harus membuat hard-code lebar untuk host EditText. Secara khusus, saya harus menentukan:
android:layout_width="172dp"
Saya benar-benar ingin memberikan lebar persentase ke host dan port EditText. (Sesuatu seperti 80% untuk host, 20% untuk port.) Apakah ini mungkin? XML berikut berfungsi pada Droid saya, tetapi tampaknya tidak berfungsi untuk semua layar. Saya ingin solusi yang lebih kuat.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/host_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/home"
android:paddingLeft="15dp"
android:paddingTop="0dp"
android:text="host"
android:textColor="#a5d4e2"
android:textSize="25sp"
android:textStyle="normal" />
<TextView
android:id="@+id/port_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/home"
android:layout_toRightOf="@+id/host_input"
android:paddingTop="0dp"
android:text="port"
android:textColor="#a5d4e2"
android:textSize="25sp"
android:textStyle="normal" />
<EditText
android:id="@+id/host_input"
android:layout_width="172dp"
android:layout_height="wrap_content"
android:layout_below="@id/host_label"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="4dp"
android:background="@android:drawable/editbox_background"
android:inputType="textEmailAddress" />
<EditText
android:id="@+id/port_input"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_below="@id/host_label"
android:layout_marginTop="4dp"
android:layout_toRightOf="@id/host_input"
android:background="@android:drawable/editbox_background"
android:inputType="number" />
<TextView
android:id="@+id/username_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/host_input"
android:paddingLeft="15dp"
android:paddingTop="15dp"
android:text="username"
android:textColor="#a5d4e2"
android:textSize="25sp"
android:textStyle="normal" />
<EditText
android:id="@+id/username_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/username_label"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="4dp"
android:background="@android:drawable/editbox_background"
android:inputType="textEmailAddress" />
<TextView
android:id="@+id/password_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/username_input"
android:paddingLeft="15dp"
android:paddingTop="15dp"
android:text="password"
android:textColor="#a5d4e2"
android:textSize="25sp"
android:textStyle="normal" />
<EditText
android:id="@+id/password_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/password_label"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="4dp"
android:background="@android:drawable/editbox_background"
android:inputType="textPassword" />
<ImageView
android:id="@+id/home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="false"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="15dp"
android:scaleType="fitStart"
android:src="@drawable/home" />
<Button
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/password_input"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:text=" login "
android:textSize="18sp" >
</Button>
</RelativeLayout>
Jawaban:
Anda sedang mencari
android:layout_weight
atribut. Ini akan memungkinkan Anda untuk menggunakan persentase untuk menentukan tata letak Anda.Pada contoh berikut, tombol kiri menggunakan 70% dari ruang, dan tombol kanan 30%.
Ini berfungsi sama dengan segala jenis Tampilan, Anda dapat mengganti tombol dengan beberapa EditText yang sesuai dengan kebutuhan Anda.
Pastikan untuk mengatur
layout_width
ke0dp
atau tampilan Anda mungkin tidak diskalakan dengan benar.Perhatikan bahwa jumlah bobot tidak harus sama dengan 1, saya hanya merasa lebih mudah dibaca seperti ini. Anda dapat mengatur bobot pertama menjadi 7 dan yang kedua menjadi 3 dan itu akan memberikan hasil yang sama.
sumber
Ini tidak cukup menjawab pertanyaan awal, yaitu untuk pemisahan 70/30, tetapi dalam kasus khusus pemisahan 50/50 antara komponen ada cara: letakkan penyangga tidak terlihat di tengah dan gunakan untuk menempatkan posisi dua komponen yang menarik.
Karena ini adalah kasus yang cukup umum, solusi ini lebih dari sekadar rasa ingin tahu. Ini sedikit hack tetapi efisien karena strut yang kosong dan berukuran nol harus sangat murah.
Namun secara umum, yang terbaik adalah jangan berharap terlalu banyak dari layout Android stock ...
sumber
RelativeLayout
?android:visibility="invisible"
pada penyangga untuk melewatkan panggilan onDraw;)Perbarui 1
Seperti yang ditunjukkan oleh @EmJiHash PercentRelativeLayout tidak digunakan lagi di API level 26.0.0
Di bawah ini mengutip komentar google:
Google memperkenalkan API baru bernama android.support.percent
Kemudian Anda bisa menentukan persentase untuk dilihat
Tambahkan kompilasi seperti ketergantungan
dalam hal itu, PercentRelativeLayout adalah apa yang dapat kita lakukan dengan tata letak yang bijaksana
sumber
Anda tidak dapat menggunakan persentase untuk menentukan dimensi Tampilan di dalam RelativeLayout. Cara terbaik untuk melakukannya adalah dengan menggunakan LinearLayout dan bobot, atau Tata Letak khusus.
sumber
Anda dapat melihat di perpustakaan dukungan persen yang baru.
docs
Sampel
sumber
Anda dapat menggunakan PercentRelativeLayout , Ini adalah tambahan tidak berdokumen baru-baru ini ke Perpustakaan Dukungan Desain , memungkinkan kemampuan untuk menentukan tidak hanya elemen relatif satu sama lain tetapi juga persentase total ruang yang tersedia.
Paket Persen menyediakan API untuk mendukung penambahan dan pengelolaan dimensi berbasis persentase di aplikasi Anda.
Untuk menggunakannya, Anda perlu menambahkan perpustakaan ini ke daftar dependensi Gradle Anda :
sumber
android:layout_width="match_parent"
Saya telah memecahkan ini dengan membuat Tampilan khusus:
Ini adalah strut tak terlihat yang bisa saya gunakan untuk menyelaraskan tampilan lain di dalam RelativeLayout.
sumber
Memperbarui
Google memperkenalkan API baru bernama android.support.percent
1) PercentRelativeLayout
2) PercentFrameLayout
Tambahkan kompilasi seperti ketergantungan
Anda dapat menentukan dimensi dalam persentase sehingga mendapatkan manfaat
RelativeLayout
dan persentasesumber
Karena PercentRelativeLayout tidak digunakan lagi dalam 26.0.0 dan tata letak bersarang seperti LinearLayout di dalam RelativeLayout memiliki dampak negatif pada kinerja ( Memahami manfaat kinerja dari ConstraintLayout ) pilihan terbaik bagi Anda untuk mencapai lebar persentase adalah dengan mengganti RelativeLayout Anda dengan ConstraintLayout.
Ini bisa diselesaikan dengan dua cara.
SOLUSI # 1 Menggunakan pedoman dengan persentase offset
SOLUSI # 2 Menggunakan rantai dengan lebar tertimbang untuk EditText
Dalam kedua kasus, Anda mendapatkan sesuatu seperti ini
sumber
PercentRelativeLayout sudah usang dari Revisi 26.0.0 dari Perpustakaan dukungan.
Google memperkenalkan Layout baru yang disebut ConstraintLayout .
Tambahkan pustaka sebagai dependensi dalam file build.gradle tingkat modul Anda:
cukup tambahkan file tata letak:
Kendala
Kendala membantu Anda menjaga agar widget tetap selaras. Anda dapat menggunakan jangkar, seperti pegangan kendala yang ditunjukkan di bawah, untuk menentukan aturan penyelarasan antara berbagai widget.
Wrap Content
: Tampilan meluas sesuai kebutuhan agar sesuai dengan isinya.Match Constraints
: Pandangan meluas sesuai kebutuhan untuk memenuhi definisi kendala setelah memperhitungkan margin. Namun, jika dimensi yang diberikan hanya memiliki satu kendala, maka tampilan meluas agar sesuai dengan isinya. Menggunakan mode ini pada ketinggian atau lebar juga memungkinkan Anda untuk mengatur rasio ukuran.Fixed
: Anda menentukan dimensi tertentu dalam kotak teks di bawah ini atau dengan mengubah ukuran tampilan di editor.Spread
: Pandangan didistribusikan secara merata (setelah margin diperhitungkan). Ini standarnya.Spread inside
: Tampilan pertama dan terakhir ditempelkan pada batasan di setiap ujung rantai dan sisanya didistribusikan secara merata.Weighted
: Ketika rantai diatur untuk menyebar atau menyebar di dalam, Anda dapat mengisi ruang yang tersisa dengan mengatur satu atau lebih tampilan untuk "cocok dengan kendala" (0dp). Secara default, ruang didistribusikan secara merata di antara setiap tampilan yang diatur ke "cocok dengan batasan," tetapi Anda dapat memberikan bobot yang penting untuk setiap tampilan menggunakan atribut layout_constraintHorizontal_weight dan layout_constraintVertical_weight. Jika Anda terbiasa dengan layout_weight dalam tata letak linier, ini bekerja dengan cara yang sama. Jadi tampilan dengan nilai bobot tertinggi mendapat ruang paling banyak; tampilan yang memiliki bobot yang sama mendapatkan jumlah ruang yang sama.Packed
: Tampilan dikemas bersama (setelah margin diperhitungkan). Anda kemudian dapat menyesuaikan bias seluruh rantai (kiri / kanan atau atas / bawah) dengan mengubah bias tampilan kepala rantai.Center Horizontally or Center Vertically
: Untuk membuat rantai pandangan dengan cepat, pilih semuanya, klik kanan salah satu tampilan, dan lalu pilih Tengah Horisontal atau Tengah Vertikal, untuk membuat rantai horizontal atau vertikalBaseline alignment
: Sejajarkan garis dasar teks dari tampilan dengan garis dasar teks dari tampilan lain.Constrain to a guideline
: Anda dapat menambahkan pedoman vertikal atau horizontal yang dapat Anda batasi tampilan, dan panduan itu tidak akan terlihat oleh pengguna aplikasi. Anda dapat memposisikan pedoman dalam tata letak berdasarkan pada unit dp atau persen, relatif terhadap tepi tata letak.Adjust the constraint bias
: Ketika Anda menambahkan batasan pada kedua sisi tampilan (dan ukuran tampilan untuk dimensi yang sama adalah "tetap" atau "membungkus konten"), tampilan menjadi terpusat di antara dua kendala dengan bias 50% secara default. Anda dapat menyesuaikan bias dengan menyeret slider bias di jendela PropertiesSet size as a ratio
: Anda dapat mengatur ukuran tampilan ke rasio seperti 16: 9 jika setidaknya satu dimensi tampilan diatur ke "cocok dengan kendala" (0dp).Anda dapat belajar lebih banyak dari dokumen resmi .
sumber
Anda dapat melakukan ini melalui bobot tata letak. Bobot menentukan bagaimana bagian layar yang tidak diklaim dibagi. Berikan setiap EditText layout_width dari 0, dan bobot proporsional. Yaitu, beri satu bobot 2, dan yang lainnya seberat 1 jika Anda ingin yang pertama mengambil ruang dua kali lebih banyak.
sumber
Cukup menarik, membangun jawaban dari @olefevre, kita tidak hanya bisa melakukan 50/50 layout dengan "struts tak terlihat", tetapi semua jenis layout melibatkan kekuatan dua.
Misalnya, berikut adalah tata letak yang memotong lebar menjadi empat bagian yang sama (sebenarnya tiga, dengan bobot 1, 1, 2):
sumber
Cukup letakkan dua host tampilan teks dan porta di horizontal linearlayout independen dan gunakan android: layout_weight untuk membuat persentase
sumber
Periksa https://github.com/mmin18/FlexLayout yang dapat Anda gunakan persen atau ekspresi java langsung di tata letak xml.
sumber