Junior
Ismeri az Android View életciklusát?
sobes.tech MI
Válasz az MI-től
Igen, ismerek.
A View életciklusa több kulcsfontosságú szakaszból áll:
- Mérés (Measurement): Meghatározza a View és gyermekei méretét. Két lépésben történik:
measure(int widthMeasureSpec, int heightMeasureSpec): Mérési folyamat.onMeasure(int widthMeasureSpec, int heightMeasureSpec): Felülírható a mérési logika megvalósításához.
- Elrendezés (Layout): Meghatározza a View és gyermekei pozícióját. Egy lépésben történik:
layout(int l, int t, int r, int b): Pozíció beállítása.onLayout(boolean changed, int l, int t, int r, int b): Felülírható az elrendezési logika megvalósításához.
- Rajzolás (Drawing): Rajzolja a View-t és gyermekeit a Canvas-ra. Egy lépésben történik:
draw(Canvas canvas): Rajzolási folyamat.onDraw(Canvas canvas): Felülírható a rajzolási logika megvalósításához.
- Csatolás/Leválasztás (Attach/Detach): Megmutatja, hogy a View csatlakoztatva van-e az ablakhoz vagy sem.
onAttachedToWindow(): Hívódik csatlakozáskor.onDetachedFromWindow(): Hívódik leválasztáskor.
Az életciklus során kérés érkezhet újramérésre (requestLayout()) vagy újrarajzolásra (invalidate()), ami a megfelelő szakaszok ismételt végrehajtásához vezet.
Egyedi View-k esetén gyakran felülírják az onMeasure, onLayout és onDraw metódusokat.
Kulcsfontosságú metódusok táblázata:
| Szakasz | Mérési metódus | Elrendezési metódus | Rajzolási metódus | Csatolási/Leválasztási metódus |
|---|---|---|---|---|
| Folyamat | measure() |
layout() |
draw() |
|
| Felülírás | onMeasure() |
onLayout() |
onDraw() |
onAttachedToWindow(), onDetachedFromWindow() |
Példa az onMeasure felülírására egy egyedi View-ban:
// Egyedi View-ban
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Mérési mód és méret lekérése
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int desiredWidth = 100; // Kívánt szélesség
int desiredHeight = 100; // Kívánt magasság
int width;
int height;
// Különböző mérési módok kezelése
if (widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
width = Math.min(desiredWidth, widthSize);
} else { // MeasureSpec.UNSPECIFIED
width = desiredWidth;
}
if (heightMode == MeasureSpec.EXACTLY) {
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
height = Math.min(desiredHeight, heightSize);
} else { // MeasureSpec.UNSPECIFIED
height = desiredHeight;
}
// Végleges méretek beállítása
setMeasuredDimension(width, height);
}