Junior
Poznáte životný cyklus View v Android?
sobes.tech AI
Odpoveď od AI
Áno, poznám.
Životný cyklus pohľadu pozostáva z niekoľkých kľúčových etáp:
- Meranie (Measurement): Určuje veľkosť pohľadu a jeho detí. Prebieha vo dvoch krokoch:
measure(int widthMeasureSpec, int heightMeasureSpec): Vykonáva meranie.onMeasure(int widthMeasureSpec, int heightMeasureSpec): Prepísava sa na implementáciu logiky merania.
- Rozloženie (Layout): Určuje pozíciu pohľadu a jeho detí. Prebieha v jednom kroku:
layout(int l, int t, int r, int b): Nastavuje pozíciu.onLayout(boolean changed, int l, int t, int r, int b): Prepísava sa na implementáciu logiky rozloženia.
- Kreslenie (Drawing): Kreslí pohľad a jeho deti na Canvas. Prebieha v jednom kroku:
draw(Canvas canvas): Vykonáva kreslenie.onDraw(Canvas canvas): Prepísava sa na implementáciu logiky kreslenia.
- Pripojenie/Odpojenie (Attach/Detach): Ukazuje, či je pohľad pripojený k oknu alebo odpojený.
onAttachedToWindow(): Volá sa pri pripojení.onDetachedFromWindow(): Volá sa pri odpojení.
Počas životného cyklu môžu nastať požiadavky na opätovné meranie (requestLayout()) alebo na opätovné prekreslenie (invalidate()), čo vedie k opakovaniu príslušných etáp.
Pre vlastné pohľady sa najčastejšie prepíšu metódy onMeasure, onLayout a onDraw.
Tabuľka kľúčových metód:
| Etapa | Metóda na meranie | Metóda na rozloženie | Metóda na kreslenie | Metóda na pripojenie/odpojenie |
|---|---|---|---|---|
| Proces | measure() |
layout() |
draw() |
|
| Prepísanie | onMeasure() |
onLayout() |
onDraw() |
onAttachedToWindow(), onDetachedFromWindow() |
Príklad prepísania onMeasure v vlastnom pohľade:
// V vlastnom pohľade
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Získanie režimu merania a veľkosti
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int desiredWidth = 100; // Želané šírka
int desiredHeight = 100; // Želené výška
int width;
int height;
// Spracovanie rôznych režimov merania
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;
}
// Nastavenie konečných rozmerov pohľadu
setMeasuredDimension(width, height);
}