Saya mengalami kesulitan besar dalam membuat LayoutInflater berfungsi seperti yang diharapkan, dan begitu juga orang lain: Bagaimana cara menggunakan layoutinflator untuk menambahkan tampilan saat runtime? .
Mengapa LayoutInflater mengabaikan parameter tata letak yang telah saya tentukan? Misalnya mengapa layout_width
dan layout_height
nilai - nilai dari sumber daya saya XML tidak dihormati?
android
android-layout
andig
sumber
sumber
Jawaban:
Saya telah menyelidiki masalah ini, merujuk pada dokumen LayoutInflater dan membuat proyek percontohan sampel kecil. Tutorial berikut menunjukkan cara mengisi tata letak secara dinamis menggunakan
LayoutInflater
.Sebelum kita mulai, lihat seperti apa
LayoutInflater.inflate()
parameternya:R.layout.main_page
)attachToRoot
adatrue
), atau hanya objek yang menyediakan seperangkatLayoutParams
nilai untuk root dari hierarki yang dikembalikan (jikaattachToRoot
adafalse
.)attachToRoot : Apakah hirarki yang meningkat harus dilampirkan ke parameter root? Jika false, root hanya digunakan untuk membuat subclass yang benar
LayoutParams
untuk tampilan root dalam XML.Pengembalian : Tampilan root dari hierarki yang meningkat. Jika akar disediakan dan
attachToRoot
adalahtrue
, ini adalah akar; jika tidak, ini adalah akar dari file XML yang dipompa.Sekarang untuk tata letak sampel dan kode.
Tata letak utama (
main.xml
):Ditambahkan ke wadah ini adalah TextView terpisah, terlihat sebagai kotak merah kecil jika parameter tata letak berhasil diterapkan dari XML (
red.xml
):Sekarang
LayoutInflater
digunakan dengan beberapa variasi parameter panggilanHasil aktual dari variasi parameter didokumentasikan dalam kode.
SYNOPSIS: Memanggil
LayoutInflater
tanpa menentukan lead root untuk mengembang panggilan mengabaikan parameter tata letak dari XML. Memanggil mengembang dengan root tidak samanull
danattachRoot=true
memuat parameter tata letak, tetapi mengembalikan objek root lagi, yang mencegah perubahan tata letak lebih lanjut ke objek yang dimuat (kecuali Anda dapat menemukannya menggunakanfindViewById()
). Karenanya, konvensi panggilan yang kemungkinan besar ingin Anda gunakan adalah yang ini:Untuk membantu dengan masalah tata letak, Inspektur Tata Letak sangat dianjurkan.
sumber
Activity
adalah subclass dariContext
dan contoh jawaban ada di ruang lingkupActivity
, jadi untuk membuatnya lebih mudah saya digantigetBaseContext()
denganthis
, demi jawaban ini, itu setara.andig benar bahwa alasan umum LayoutInflater mengabaikan layout_params Anda adalah karena root tidak ditentukan. Banyak orang berpikir Anda dapat melewatkan null untuk root. Ini dapat diterima untuk beberapa skenario seperti dialog, di mana Anda tidak memiliki akses ke root pada saat pembuatan. Namun, aturan yang baik untuk diikuti adalah jika Anda memiliki root, berikan ke LayoutInflater.
Saya menulis posting blog yang mendalam tentang hal ini yang dapat Anda lihat di sini:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
sumber
This is acceptable for a few scenarios such as a dialog
itu yang saya butuhkaningin menambah jawaban utama di atas
saya mencoba untuk mengikutinya tetapi recyclerView saya mulai meregangkan setiap item ke layar
saya harus menambahkan baris berikutnya setelah menggembungkan untuk mencapai tujuan
Saya sudah menambahkan params ini dengan xml tetapi tidak bekerja dengan benar
dan dengan baris ini semuanya ok
sumber