Sobes.tech
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:

  1. 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.
  2. 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.
  3. 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.
  4. 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);
 }