Bagaimana cara mengukur tampilan berdasarkan ukuran tata letak induknya. Misalnya saya memiliki a RelativeLayout
yang memenuhi layar penuh, dan saya ingin tampilan anak, katakanlah ImageView
, untuk memenuhi seluruh tinggi, dan 1/2 lebarnya?
Saya sudah mencoba mengesampingkan semua pada onMeasure
, onLayout
, onSizeChanged
, dll dan saya tidak bisa mendapatkannya untuk bekerja ....
Jawaban:
Saya tidak tahu apakah ada yang masih membaca utas ini atau tidak, tetapi solusi Jeff hanya akan membuat Anda setengah jalan (agak harfiah). Apa yang akan dilakukan onMeasure-nya adalah menampilkan setengah gambar di setengah induknya. Masalahnya adalah memanggil super.onMeasure sebelum
setMeasuredDimension
akan mengukur semua anak dalam tampilan berdasarkan ukuran aslinya, lalu memotong tampilan menjadi dua saatsetMeasuredDimension
mengubah ukurannya.Sebagai gantinya, Anda perlu memanggil
setMeasuredDimension
(seperti yang diperlukan untuk onMeasure override) dan memberikan tampilan baruLayoutParams
untuk tampilan Anda, lalu panggilsuper.onMeasure
. Ingat, AndaLayoutParams
berasal dari tipe induk tampilan Anda, bukan tipe tampilan Anda.Saya percaya satu-satunya saat Anda akan memiliki masalah dengan orang tua
LayoutParams
adalah jika orang tua adalahAbsoluteLayout
(yang usang tetapi terkadang masih berguna).sumber
MeasureSpec.getSize(widthMeasureSpec)
benar-benar memberikan lebar induk yang benar? Bagi saya itu hanya mengembalikan lebar acak yang cukup dekat dengan lebar sebenarnya, tetapi tidak tepat.wrap_content
tidak akan berhasil. Jawaban Vic tidak berfungsi untuk skenario ini, tetapi komentar @ M.Schenk berhasil. Ini juga menghemat izin tata letak ekstra. Anda juga harus mempostingnya sebagai jawaban untuk visibilitas.super.onMeasure()
hanya menimpa dan meniadakan efek dari panggilan sebelumnya kethis.setMeasuredDimension()
?super.onMeasure()
tidak menggantikan penghitungan sebelumnya.Anda bisa mengatasi ini dengan membuat Tampilan kustom dan mengganti metode onMeasure (). Jika Anda selalu menggunakan "fill_parent" untuk layout_width di xml Anda, parameter widthMeasureSpec yang diteruskan ke metode onMeasusre () harus berisi lebar induknya.
XML Anda akan terlihat seperti ini:
sumber
Saya telah menemukan bahwa yang terbaik adalah tidak mengotak-atik pengaturan sendiri dimensi yang diukur. Sebenarnya ada sedikit negosiasi yang terjadi antara pandangan orang tua dan anak dan Anda tidak ingin menulis ulang semua kode itu .
Namun, yang dapat Anda lakukan adalah memodifikasi measureSpecs, lalu memanggil super dengannya. Pandangan Anda tidak akan pernah tahu bahwa itu mendapatkan pesan yang dimodifikasi dari induknya dan akan mengurus semuanya untuk Anda:
sumber
Saat Anda menentukan tata letak dan tampilan di XML, Anda bisa menentukan lebar dan tinggi tata letak tampilan untuk membungkus konten, atau mengisi induk. Mengambil separuh area agak sulit, tetapi jika Anda memiliki sesuatu yang Anda inginkan di separuh lainnya, Anda dapat melakukan hal seperti berikut.
Memberi dua benda bobot yang sama berarti mereka akan meregang untuk mengambil proporsi layar yang sama. Untuk info lebih lanjut tentang tata letak, lihat dokumen dev.
sumber
Saya percaya bahwa pendekatan XML Mayras bisa datang dengan rapi. Namun dimungkinkan untuk membuatnya lebih akurat, dengan satu tampilan hanya dengan mengatur weightSum. Saya tidak akan menyebut ini peretasan lagi tetapi menurut saya pendekatan yang paling mudah:
Seperti ini, Anda dapat menggunakan bobot berapa pun, misalnya 0,6 (dan pemusatan) adalah bobot yang ingin saya gunakan untuk tombol.
sumber
Coba ini
lalu Anda bisa menggunakan LinearLayout.LayoutParams untuk menyetel parameter chileView
sumber
Anda sekarang dapat menggunakan PercentRelativeLayout. Ledakan! Masalah terpecahkan.
sumber
Roman, jika Anda ingin melakukan layout Anda dalam kode Java (keturunan ViewGroup), itu mungkin. Triknya adalah Anda harus mengimplementasikan metode onMeasure dan onLayout. OnMeasure dipanggil lebih dulu dan Anda perlu "mengukur" subview (secara efektif menyesuaikan ukurannya ke nilai yang diinginkan) di sana. Anda perlu mengukurnya lagi di panggilan onLayout. Jika Anda gagal melakukan urutan ini atau gagal memanggil setMeasuredDimension () di akhir kode onMeasure, Anda tidak akan mendapatkan hasil. Mengapa ini dirancang sedemikian rumit dan rapuh berada di luar jangkauan saya.
sumber
Jika sisi lainnya kosong. Saya rasa cara termudah adalah dengan menambahkan tampilan kosong (mis. Tata letak linier) lalu menyetel lebar tampilan ke fill_parent dan keduanya bobotnya ke 1.
Ini bekerja di LinearLayout ...
sumber
Sesuatu seperti ini:
sumber
Saya telah bergumul dengan pertanyaan ini sejak lama, saya ingin mengubah lebar laci DrawerLayout saya, yang merupakan anak kedua dari orang tuanya. Baru-baru ini saya menemukan jawabannya, tetapi tidak tahu apakah ada ide yang lebih baik.
sumber