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_parent
situasi daripada wrap_content
situasi). Kendala ini dikemas ke dalam MeasureSpec
nilai - nilai yang dilewatkan ke dalam metode. Berikut ini adalah korelasi kasar dari nilai mode:
- PERSIS berarti
layout_width
atau layout_height
nilai ditetapkan untuk nilai tertentu. Anda mungkin harus melihat ukuran ini. Ini juga bisa dipicu ketika match_parent
digunakan, untuk mengatur ukuran persis ke tampilan induk (ini adalah tata letak yang bergantung pada kerangka kerja).
- AT_MOST biasanya berarti nilai
layout_width
atau layout_height
diatur ke match_parent
atau di wrap_content
mana 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_width
atau layout_height
nilai ditetapkan untuk wrap_content
tanpa 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 View
dalamnya, itulah sebabnya mengapa lebih aman untuk memanggilnya super
jika 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_content
di kedua arah, tampilan Anda mungkin tidak muncul sama sekali karena kerangka tidak tahu seberapa besar itu!
Secara umum, jika Anda mengesampingkan View
dan 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.