onMeasure()adalah kesempatan Anda untuk memberi tahu Android seberapa besar Anda ingin tampilan khusus bergantung pada batasan tata letak yang disediakan oleh orang tua; ini juga merupakan kesempatan tampilan kustom Anda untuk mempelajari batasan tata letak tersebut (jika Anda ingin berperilaku berbeda dalam match_parentsituasi daripada wrap_contentsituasi). Kendala ini dikemas ke dalam MeasureSpecnilai - nilai yang dilewatkan ke dalam metode. Berikut ini adalah korelasi kasar dari nilai mode:
- PERSIS berarti
layout_widthatau layout_heightnilai ditetapkan untuk nilai tertentu. Anda mungkin harus melihat ukuran ini. Ini juga bisa dipicu ketika match_parentdigunakan, untuk mengatur ukuran persis ke tampilan induk (ini adalah tata letak yang bergantung pada kerangka kerja).
- AT_MOST biasanya berarti nilai
layout_widthatau layout_heightdiatur ke match_parentatau di wrap_contentmana ukuran maksimum diperlukan (ini tergantung tata letak dalam kerangka kerja), dan ukuran dimensi induk adalah nilainya. Anda tidak boleh lebih besar dari ukuran ini.
- Tidak disebutkan biasanya berarti
layout_widthatau layout_heightnilai ditetapkan untuk wrap_contenttanpa pembatasan. Anda bisa berapa pun ukuran yang Anda inginkan. Beberapa tata letak juga menggunakan panggilan balik ini untuk mengetahui ukuran yang Anda inginkan sebelum menentukan spesifikasi apa yang benar-benar melewati Anda lagi dalam permintaan ukuran kedua.
Kontrak yang ada dengan itu onMeasure()adalah setMeasuredDimension() HARUS dipanggil di akhir dengan ukuran yang Anda inginkan. Metode ini dipanggil oleh semua implementasi kerangka kerja, termasuk implementasi default yang ditemukan di Viewdalamnya, itulah sebabnya mengapa lebih aman untuk memanggilnya superjika cocok dengan use case Anda.
Memang, karena kerangka kerja memang menerapkan implementasi default, mungkin Anda tidak perlu menimpa metode ini, tetapi Anda mungkin melihat kliping dalam kasus di mana ruang tampilan lebih kecil dari konten Anda jika Anda tidak, dan jika Anda meletakkan tampilan kustom dengan wrap_contentdi kedua arah, tampilan Anda mungkin tidak muncul sama sekali karena kerangka tidak tahu seberapa besar itu!
Secara umum, jika Anda mengesampingkan Viewdan bukan widget lain yang ada, mungkin ide yang baik untuk memberikan implementasi, bahkan jika sesederhana seperti ini:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 100;
int desiredHeight = 100;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
//MUST CALL THIS
setMeasuredDimension(width, height);
}
Semoga Itu Membantu.