Saat menerima fokus, Activity
akan diminta untuk menggambar
tata letaknya.
Framework Android akan menangani prosedur menggambar, tetapi
Activity
harus menyediakan
node root hierarki tata letaknya.
Proses menggambar dimulai dengan node root tata letak. Struktur tata letak harus diukur
dan digambar. Proses menggambar ditangani dengan mengikuti struktur tersebut dan merender setiap
View
yang berpotongan dengan area yang tidak valid. Selanjutnya, setiap
ViewGroup
bertanggung jawab meminta agar
setiap turunannya digambar
(dengan metode draw()
)
dan setiap View
bertanggung jawab untuk menggambar dirinya sendiri.
Karena struktur ini dilalui sesuai urutan yang ditentukan sebelumnya,
tampilan induk harus digambar sebelum (artinya, di belakang) turunannya, sedangkan
tampilan yang setara digambar sesuai urutan kemunculannya dalam struktur.
Catatan: Framework tidak menggambar objek View
yang berada
di luar area yang valid, dan juga
menangani proses menggambar latar belakang View
untuk Anda.
Anda dapat memaksa View
untuk digambar, dengan memanggil
invalidate()
.
Menggambar tata letak adalah proses dua tahap: tahap pengukuran dan tahap tata letak.
Tahap pengukuran
Tahap pengukuran diimplementasikan dalam measure(int, int)
dan mengikuti urutan struktur View
dari atas ke bawah. Setiap View
mendorong spesifikasi dimensi ke bawah dalam
struktur selama rekursi. Pada akhir tahap pengukuran, setiap
View
telah menyimpan
ukurannya. Tahap kedua berlangsung di
layout(int, int, int, int)
dan juga dari atas ke bawah. Selama
tahap ini, setiap induk bertanggung jawab untuk menentukan posisi semua turunannya
berdasarkan ukuran yang dihitung selama tahap pengukuran.
Saat metode measure()
dari objek View
ditampilkan, nilai getMeasuredWidth()
dan
getMeasuredHeight()
-nya harus ditetapkan, begitu juga
nilai untuk semua keturunan objek View
tersebut.
Nilai tinggi dan lebar
terukur objek View
harus mengikuti batasan yang diberlakukan oleh
induk objek View
. Hal ini menjamin
bahwa pada akhir tahap pengukuran, semua induk menyetujui ukuran untuk
semua turunannya. View
induk dapat memanggil
measure()
lebih dari sekali di lokasi
turunannya. Misalnya, induk dapat mengukur setiap turunan satu kali
dengan dimensi yang tidak ditentukan untuk mengetahui sebesar apa ukuran yang diinginkan, lalu memanggil
kembali measure()
dengan dimensi
yang sebenarnya jika jumlah ukuran
yang tidak dibatasi untuk semua turunan
terlalu besar atau terlalu kecil (dengan kata lain, jika turunan
tidak saling bersesuaian dari segi ruang yang tersedia, induk akan mengintervensi dan menetapkan
aturan pada tahap kedua).
Tahap pengukuran menggunakan dua class untuk mengomunikasikan dimensi. Class
ViewGroup.LayoutParams
digunakan oleh objek
View
untuk memberitahukan ukuran dan posisi
yang diinginkan kepada induknya. Class
ViewGroup.LayoutParams
dasar hanya
menjelaskan seberapa besar tinggi dan lebar yang
diharapkan View
. Untuk setiap
dimensi, salah satu dari berikut ini dapat ditetapkan:
- dimensi persis
MATCH_PARENT
, yang berartiView
ingin sebesar induknya (dikurangi padding)WRAP_CONTENT
, yang berartiView
ingin cukup besar sehingga dapat mencakup isinya (plus padding).
Terdapat subclass ViewGroup.LayoutParams
untuk
subclass yang berbeda dari ViewGroup
.
Misalnya, RelativeLayout
memiliki subclass-nya sendiri,
yaitu ViewGroup.LayoutParams
, yang memiliki
kemampuan untuk menempatkan objek View
turunan di tengah-tengah
baik secara horizontal maupun vertikal.
Objek MeasureSpec
digunakan untuk mendorong
persyaratan ke bawah dalam struktur dari induk ke
turunan. MeasureSpec
dapat berupa salah satu dari
tiga mode berikut:
UNSPECIFIED
: Digunakan oleh induk untuk menentukan dimensi yang diinginkan untukView
turunan. Misalnya,LinearLayout
dapat memanggilmeasure()
di lokasi turunannya dengan tinggi ditetapkan keUNSPECIFIED
dan lebarEXACTLY
240 untuk mengetahui tinggiView
turunan yang diinginkan jika lebar ditetapkan ke 240 piksel.EXACTLY
: Digunakan oleh induk untuk menerapkan ukuran persis pada turunan. Turunan harus menggunakan ukuran ini, dan menjamin bahwa semua turunannya akan cocok dalam ukuran tersebut.AT MOST
: Digunakan oleh induk untuk menerapkan ukuran maksimum pada turunan. Turunan harus menjamin bahwa ia beserta semua keturunannya akan cocok dalam ukuran ini.
Tahap tata letak
Untuk memulai sebuah tata letak, panggil requestLayout()
.
Metode ini biasanya dipanggil
oleh View
di lokasinya sendiri
jika merasa tidak pas lagi dalam batas-batasnya
saat ini.