Krása z fragmentov. Ako vylepšiť používateľské rozhranie v systéme Android pomocou triedy Fragment. Životný cyklus fragmentu Pokračovanie je k dispozícii iba pre účastníkov

Keď už hovoríme o vývoji pre Android, nemožno to nespomenúť fragmenty.

Čo je to fragment?

Fragment je špeciálny prvok rozhrania, ktorý má uľahčiť vytváranie responzívnych aplikácií fungujúcich na smartfónoch aj tabletoch.

Fragment obsahuje prvky rozhrania v sebe, rovnako ako aktivita, medzi týmito dvoma konceptmi však existuje niekoľko kľúčových rozdielov:

  • Fragment obsiahnuté vo vnútri Činnosť.
  • Vo vnútri Činnosť môže ich byť niekoľko fragmenty, to znamená, že na obrazovke môže byť niekoľko fragmentov naraz, zatiaľ čo Činnosť vždy sám kedykoľvek.

Implementácia aplikácie bez fragmentov

Pozrime sa na konkrétny príklad, aby sme lepšie pochopili, ako to funguje.

Poďme si predstaviť, že máme aplikáciu obsahujúcu dve obrazovky:

  • Obrazovka s novinkami.
  • Obrazovka s podrobnosťami o novinkách sa otvorí kliknutím na položku zoznamu v predchádzajúcej aktivite.

Takto to vyzerá na telefóne:


Ukázalo sa, že máme dve aktivity, z ktorých každá obsahuje určité prvky rozhrania. Nech je to FeedActivity pre prvú obrazovku a DetailActivity pre druhú obrazovku.

Teraz si predstavte, že musíme vytvoriť aj aplikáciu pre tablety:


V takom prípade zobrazujeme obsah z oboch obrazoviek na jednej, pričom používame rovnaké prvky. Ukazuje sa, že potrebujeme tretiu aktivitu, napríklad TabletFeedActivity.

Bude tento prístup fungovať? Áno. Má pravdu? Rozhodne nie.

Pri použití tohto prístupu nielenže vytvárame ďalšie nepotrebné aktivity, ale tiež nám chýba schopnosť opakovane používať kód - takmer všetok kód v aplikácii TabletFeedActivity sa jednoducho skopíruje z FeedActivity a DetailActivity!

A tu nám fragmenty prichádzajú na pomoc!

Implementácia aplikácie s fragmentmi

Ponechávame FeedActivity a DetailActivity, ale predstavujeme dve ďalšie triedy - FeedFragment ( Fragment # 1 na obrázku nižšie) a DetailFragment ( Fragment # 2 na obrázku nižšie).

V prípade telefónu je FeedFragment umiestnený v FeedActivity a DetailFragment je v DetailActivity:

Ak je aplikácia spustená na tablete, do FeedActivity pridáme oba fragmenty, zatiaľ čo DetailActivity sa nepoužíva vôbec. Všetci!


Nepíšeme teda zbytočný kód a naša aplikácia začne plne reagovať.

Rovnako ako s Činnosť, o fragment existuje životný cyklus.

Fragment môže mať tri stavy:

  • Zastavené - Fragment nie je na obrazovke viditeľný. Existuje, ale nie je k dispozícii pre interakciu používateľa a môže sa zničiť, ak dôjde k zničeniu súvisiacej aktivity.
  • Pozastavené - Fragment je viditeľný na obrazovke, ale môže sa prekrývať inými prvkami rozhrania (napríklad v popredí je iná aktivita).
  • Obnovené - Fragment je viditeľný na obrazovke a je k dispozícii používateľovi.

Prezrite si tabuľku spätných volaní fragmentov, ktoré sa volajú príslušne, keď sa zmení stav aktivity:

Poďme sa pozrieť na niektoré z nich.

  • onAttach () - Fragment "pripojený k Činnosť.
  • onCreate () - Fragment je vytvorený.
  • onCreateView () - volá sa na vytváranie prvkov rozhrania (napríklad nafúknutie XML).
  • onActivityCreated () - volá sa po metóde onCreate () v Činnosť.
  • onDestroyView () - Volá sa, keď je pohľad vytvorený v aplikácii onCreateView „oddelený“ od fragmentu.
  • onDetach () - Fragment „odtrhne“ sa od Činnosť.

Všeobecne je všetko veľmi podobné činnosti, s výnimkou niektorých nových spätných volaní.

Skúsme to v praxi

Pridávanie fragmentov

Vytvorme aplikáciu s dvoma úryvkami:

  • Fragment s prepínačmi, pomocou ktorého vyberáme farbu.
  • Fragment sa jednoducho vyplní vybranou farbou.

V telefóne to budú dve obrazovky - na prvej vyberieme farbu, po ktorej začne Aktivita fragmentom zobrazujúcim farbu.

Tablet bude mať iba jednu obrazovku s dvojitým panelom, rovnako ako v príklade, ktorý som uviedol vyššie.

Najskôr poďme na to, ako môžeme vytvoriť fragment a pridať ho do aktivity.

Vytvorte nový projekt s novým fragmentom:

Verejná trieda SelectionFragment rozširuje Fragment (public SelectionFragment () () @Nullable @Override public View onCreateView (LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) (return super.onCreateView (inflater, container, savedInstanceState);))

Poznámka: fragment musí mať konštruktor bez parametrov a nesmú existovať nijaké ďalšie konštruktory, pretože pri opätovnom vytvorení fragmentu sa nebudú volať.

Vytvorme tiež súbor s rozložením pre fragment - fragment_selection.xml:

Teraz nafúkneme rozloženie vnútri metódy onCreateView ():

@Nullable @Override verejné zobrazenie onCreateView (LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) (View view \u003d inflater.inflate (R.layout.fragment_selection, container, false); view.setBackgroundColor (Color.RED); návrat; )

Nastavil som farbu na červenú, aby bolo jasné, kde je fragment.

Existujú dva spôsoby, ako pridať fragment k aktivite:

  • Cez XML. V takom prípade nebude možné odstrániť fragment za behu programu.
  • Za behu.

Pridanie úryvku do XML

Skúsme pridať úryvok do súboru activity_main.xml:

Spustite aplikáciu:

Pridáva sa fragment za behu programu

Najskôr nahraďte rozloženie rozloženia MainActivity nasledujúcim:

FrameLayout v tomto prípade bude slúžiť ako kontajner pre fragment.

Teraz na konci metódy onCreate () v MainActivity pridajte nasledujúci kód:

SelectionFragment selectionFragment \u003d nový SelectionFragment (); FragmentManager fragmentManager \u003d getFragmentManager (); fragmentManager.beginTransaction () .add (R.id.container, selectionFragment) .commit ();

Vytvoríme fragment, získame správcu fragmentov a fragment pridáme do kontajnera.

FragmentManager je špeciálna trieda, prostredníctvom ktorej prebieha interakcia s fragmentmi.

Poznámka: V súprave Android SDK existujú dve implementácie úryvkov: bežné a od Podpora knižníc v4... Aj keď väčšina príkladov na webe využíva implementáciu podpornej knižnice, nie je v súčasnosti skutočne potrebné ju používať, pretože bola vytvorená tak, aby fungovali úryvky vo verziách systému Android starších ako 3.0.

Od verzie 3.0 môžete používať bežnú implementáciu.

Po spustení aplikácie uvidíte, že výsledok je rovnaký:

Vytvorte rozloženie s dvoma panelmi

Budeme teda potrebovať dve rozloženia pre MainActivity: jedno pre telefóny, druhý pre tablety.

Vytvorme rozloženie pre tabletu... To sa deje rovnakým spôsobom ako obvykle s jedným rozdielom:


Ako vidíte, vybral som kvalifikáciu Najmenšia šírka obrazovky a zadali hodnotu 600. Toto rozloženie sa teda použije iba na zariadeniach so šírkou obrazovky minimálne 600 dpi. To sa zhruba rovná 7-palcovému tabletu.

Štandardné rozloženie (pre telefóny) bude takto:

Pretože Android pri vytváraní rozhraní podporuje maximálne využitie deklaratívneho prístupu a navyše nebudeme musieť odstraňovať alebo nahrádzať SelectionFragment, deklarujeme ho priamo v XML.

Rozloženie pre tablety by bolo toto:

Tu používame SelectionFragment rovnakým spôsobom, nezaberá však celú obrazovku, ale iba tretinu a navyše sme pridali kontajner pre druhý fragment - nahradíme ho za behu, takže nebude fungovať jeho pridanie do XML.

Pretože teraz nepridávame SelectionFragment dynamicky, odstráňte všetok súvisiaci kód z onCreate () v MainActivity.

Vytvorte pre svoj tablet aj nový emulátor, napríklad tento:


Spustite na ňom aplikáciu:


Ako vidíte, na tablete SelectionFragment zaberá ľavých 30% obrazovky. Zvyšok miesta je vyhradený pre druhý fragment, ktorý ešte nie je k dispozícii.

Poďme do toho a pridajme prepínače na výber farieb.

RadioButton a RadioGroup

RadioButton je komponent na vytváranie prepínačov. Pretože RadioButton by sa nemal používať samostatne, existuje aj jeho rozloženie - RadioGroup.

RadioGroup zdedí LinearLayout a obsahuje niekoľko RadioButtonov. Ovláda exkluzivitu výberu (koniec koncov je možné zvoliť iba jeden prepínač súčasne). Dedením z LinearLayout môže byť vertikálne aj horizontálne.


Pokračovanie je k dispozícii pri platených programoch

A spolu s tým - kontrola domácich úloh od našich mentorov.

Je to úplne lacné - iba od 0 ₽ za mesiac!

Posledná aktualizácia: 30.10.2015

Každá trieda fragmentov dedí zo základnej triedy Fragmentov a má vlastný životný cyklus, ktorý sa skladá z niekoľkých etáp:

    onAttach (): Po vykonaní tejto metódy je fragment spojený s konkrétnou aktivitou. V tomto okamihu fragment a aktivita ešte neboli úplne inicializované.

    onCreate (): fragment sa vytvára. Táto metóda sa volá po vyvolaní príslušnej metódy onCreate () na aktivite.

    onCreateView (): fragment vytvára vizuálne rozhranie

    onActivityCreated (): Volá sa po vytvorení aktivity. Odteraz je možné ku komponentom rozhrania pristupovať pomocou metódy findViewById ()

    onStart (): volá sa, keď je fragment viditeľný

    onResume (): fragment sa stane aktívnym

    onPause (): fragment je naďalej viditeľný, ale už nie je aktívny

    onStop (): fragment už nie je viditeľný

    onDestroyView (): Zničte rozhranie predstavujúce fragment

    onDestroy (): trvalé zničenie fragmentu

V kóde triedy fragmentov môžeme prepísať všetky alebo časť týchto metód.

Pretože fragmenty sa často používajú na konkrétne účely, napríklad na zobrazenie zoznamu niektorých objektov, štandardne máme prístup k triedam odvodeným od fragmentu, ktoré už majú určité možnosti:

    ListFragment: spravuje zoznam položiek pomocou jedného z adaptérov

    DialogFragment: používa sa na vytváranie dialógových okien

    PreferenceFragment: používa sa na správu nastavení aplikácie

Na vytvorenie nového úryvku môžete použiť bežné triedy. Android Studio však už ponúka množstvo vstavaných šablón:

Pri vytváraní budete požiadaní, aby ste nastavili názov projektu, názov označovacieho súboru rozhrania a množstvo ďalších možností:

Trieda fragmentov generovaná Android Studio bude veľmi podobná triedam fragmentov použitých predtým:

Balík com.example.eugene.testapp; import android.app.Activity; import android.net.Uri; importovať android.os.Bundle; import android.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class BlankFragment extends Fragment (private static final String ARG_PARAM1 \u003d "param1"; private static final String ARG_PARAM2 \u003d "param2"; private String mParam1; private String mParam2; private OnFragmentInteractionListener mListener; // Továreň na vytvorenie fragmentu verejného statického BlankFragmentu newInstance param1, String param2) (BlankFragment fragment \u003d new BlankFragment (); Bundle args \u003d new Bundle (); args.putString (ARG_PARAM1, param1); args.putString (ARG_PARAM2, param2); fragment.setArgumenty (args); návratový fragment; ) public BlankFragment () (// Constructor) @Override public void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); if (getArguments ()! \u003d null) (mParam1 \u003d getArguments (). getString (ARG_PARAM1); mParam2 \u003d getArguments (). getString (ARG_PARAM2);)) @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) (return inflater.inflate (R.layout.fragment_blank, kontajner, nepravda); ) public void onButtonPressed (Uri uri) (if (mListener! \u003d null) (mListener.onFragmentInteraction (uri);)) @Override public void onAttach (Activity activity) (super.onAttach (activity); try (mListener \u003d (OnFragmentInteractionListener)) activity;) catch (ClassCastException e) (throw new ClassCastException (activity.toString () + "must implement OnFragmentInteractionListener");)) @Override public void onDetach () (super.onDetach (); mListener \u003d null;) verejné rozhranie OnFragmentInteractionListener (public void onFragmentInteraction (Uri uri);))

Preto môžeme fragmenty vytvárať manuálne alebo použiť jednu zo šablón poskytovaných Android Studio.

Vytvorenie dobrého používateľského rozhrania je ťažké, najmä ak v tejto oblasti ešte nemáte veľa skúseností. Preto je tu rýchly test na poznanie otázky: ak ste zvyknutí na to, že pre nové okno určite potrebujete Aktivitu alebo namiesto plynulej animácie v čerstvo napísanom programe z nejakého dôvodu dôjde ku kŕčom - tento článok je pre vás 🙂

Rake Activity

Väčšina tutoriálov demonštrujúcich vývojové triky pre Android sa začína rovnakým spôsobom: neskúseným vývojárom sa ponúka vloženie všetkých vizuálnych prvkov priamo do označenia XML hlavnej aktivity. Vyzerá to takto:

Verejná trieda MainActivity rozširuje AppCompatActivity (@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); ...

Tento dizajn sa stal zvykom a projekt je naplnený novými aktivitami s čoraz zložitejšími značkami. Výsledkom je, že aj minimálne užitočná aplikácia porastie zásobníkom aktivity, pohltí všetku pamäť RAM a kamene a dvojky odletia vývojárovi v službe Google Play.

A to všetko preto, že operačný systém Android vôbec nesľubuje, že vaše aktivity zostanú nažive. Ako si pamätáte, tieto komponenty existujú nezávisle na sebe a majú špeciálny životný cyklus. Ak Aktivita prejde do stavu onPause a stane sa to pomerne často, stane sa z nej Schrödingerova mačka: nemôžete vopred vedieť, či bude nažive alebo nie.

Používaním ďalších aktivít na zobrazovanie ponúk a ďalších drobností ohrozujete všetky logické spojenia v rámci aplikácie. Aktivity sa zhromažďujú v zásobníku a operačný systém ich môže začať vykladať jednotlivo alebo v skupine. Keď sa chce používateľ vrátiť do predchádzajúceho okna, aktivita už môže byť zničená a používateľ z aplikácie vypadne.

Okrem problémov s udržiavaním logiky existuje aj rutina údržby kódu OOP: rozhrania úzko spojené s aktivitou je takmer nemožné ďalej rozvíjať. Mierka, rýchle nahradenie niektorých prvkov inými, animácia - to všetko bude v nových verziách aplikácie implementovateľné len veľmi ťažko.

Vďaka trendu smerom k jedinému ekosystému sa všetky mobilné aplikácie vo všeobecnosti stali veľmi podobnými. Stačí nájsť cestu a trochu trénovať, a potom začne kvalita rýchlo rásť. Podľa princípu „kritizujte, navrhnite“ teraz napíšeme aplikáciu, ktorá implementuje univerzálne užívateľské rozhranie. Bude to zaujímavé nielen z akademického hľadiska - som si istý, že dnes napísaný kód môžete ľahko integrovať do svojich projektov. Takže, začnime!

Fragmenty

Aby bola práca s používateľským rozhraním ľahšia a rýchlejšia, Google vytvoril Fragment - triedu - vrstvu medzi Aktivitou a vizuálnymi súčasťami programu. Na jednej strane je to kontajner pre akékoľvek objekty zobrazenia, ktoré sa môžu používateľovi zobraziť. Na druhej strane je to pokračovanie aktivity, z ktorej fragment získava všetky informácie o zmenách v životnom cykle.

Fragmenty, podobne ako aktivita, majú svoj vlastný (aj keď pôvodnejší) životný cyklus. Napríklad práca s UI ihneď po vytvorení fragmentu je nemožná, musíte počkať, kým sa načítajú všetky prvky - po metóde onCreate sa vykoná metóda onCreateView, kde môžete načítať prvky.

Verejná trieda FragmentOne rozširuje Fragment (... public View onCreateView (...) (View view \u003d inflater.inflate (R.layout.fragment_one, container, false); TextView textView \u003d (TextView) view.findViewById (R.id. fo_text); textView.setText ("Ahoj, ja som prvý fragment!"); spätné zobrazenie; ...

Vo fragmente môžete tiež prepísať všetky metódy, ktoré sledujú stav okna. Pokiaľ teda aplikácia ide do pozadia, v aktivite sa vykoná onPause a potom sa tu vykoná metóda s presne rovnakým názvom. To môže byť užitočné - užitočné pri odpojení od objektov tretích strán, napríklad viazaných služieb.

Fragmentová transakcia

S vedomím, že práca s fragmentmi bude intenzívna, spoločnosť Google na to vopred vytvorila špeciálne nástroje. Triedy FragmentManager a FragmentTransaction hromadia všetky procesy: vytváranie nových fragmentov a ich odstraňovanie, prenos údajov atď.

Nie je potrebné vytvárať objekt FragmentManager, je už v každej aktivite, stačí na ňu získať odkaz. A všetky akcie prejdú FragmentTransaction, ktorá potom nezávisle prenesie údaje do správcu fragmentov.

FragmentManager manager \u003d getSupportFragmentManager (); FragmentTransaction transaction \u003d manager.beginTransaction ();

Chcem poznamenať, že triedy, ktoré pracujú s fragmentmi, sú k dispozícii v dvoch príchutiach. Odporúčam použiť novšiu verziu - to sú tie, ktoré majú v ceste importu riadok android.support.v4. Je to veľká knižnica navrhnutá pre spätnú kompatibilitu. Google je opatrný pri zariadeniach vo všetkých verziách operačného systému a knižnice vám umožňujú používať vývojové inovácie aj pri práci so starým rozhraním API.

Importujte android.support.v4.app.FragmentTransaction; importovať android.support.v4.app.Fragment; ...

FrameLayout

Údaje v používateľskom rozhraní často prichádzajú dynamicky, podľa toho, čo sa stane. Na umiestnenie obrázka alebo textu existuje špeciálny kontajner - FrameLayout. Toto je jeho hlavná úloha - rezervovať miesto na obrazovke pre akýkoľvek objekt triedy View, ktorý je možné načítať neskôr. V takýchto nádobách žijú aj fragmenty.

Existujú rôzne spôsoby, ako pridať nový fragment do FrameLayout: FragmentTransaction má podobné metódy nahradenia a pridania.

Transaction.replace (R.id.frame_container, fragmentObject);

Napriek vonkajšej podobnosti musíte dobre pochopiť, aký výsledok môžete dosiahnuť. Metóda nahradenia funguje veľmi jednoducho - pridá fragment a ak v kontajneri predtým niečo bolo, staré fragmenty odstráni.

Transaction.add (R.id.frame_container, fragment);

Metóda add vytvára stoh fragmentov a každé nové volanie posúva novú inštanciu do hornej časti stohu. Je dôležité, aby pri objavení nového fragmentu nedostali staré objekty v zásobníku žiadne upozornenia a fungovali, akoby sa nič nestalo. To znamená, že metóda onPause pre nich nebude vykonaná a budú naďalej spotrebovávať prostriedky zariadenia, aj keď ich používateľ už nebude vidieť.

Takéto plytvanie pridelenej pamäte možno odôvodniť napríklad tým, že chcete usporiadať predspracovanie údajov: fragment môže načítať niečo, keď je neviditeľný, a potom zobraziť už hotový výsledok.

S fragmentmi môže byť niekoľko akcií, ktoré sa budú hromadiť, kým nebude vykonaná metóda potvrdenia.

Transaction.commit ();

Pokračovanie je k dispozícii iba členom

Možnosť 1. Pripojte sa ku komunite „site“ a prečítajte si všetky materiály na webe

Členstvo v komunite počas stanoveného obdobia vám otvorí prístup k VŠETKÝM hackerským materiálom, zvýši vašu osobnú kumulatívnu zľavu a umožní vám akumulovať profesionálne skóre Xakep!

Obrázok 2. Životný cyklus fragmentov (počas prevádzky)

Ak chcete vytvoriť úryvok, musíte vytvoriť podtriedu triedy (alebo jej existujúcej podtriedy). Trieda má kód, ktorý je veľmi podobný kódu. Obsahuje metódy spätného volania podobné operačným metódam ako, a. V praxi, ak chcete transformovať existujúcu aplikáciu pre Android na použitie fragmentov, stačí presunúť kód z metód spätného volania operácie na zodpovedajúce metódy spätného volania fragmentu.

Spravidla musíte implementovať nasledujúce metódy životného cyklu:

Systém túto metódu volá, keď vytvára fragment. Pri svojej implementácii musí vývojár inicializovať kľúčové komponenty fragmentu, ktoré je potrebné uchovať, keď je fragment po zastavení pozastavený alebo obnovený. Systém volá túto metódu pri prvom zobrazení Fragment UI. Ak chcete nakresliť používateľské rozhranie fragmentu, vráťte z tejto metódy koreňový objekt v rozložení fragmentu. Ak fragment nemá používateľské rozhranie, môže sa vrátiť hodnota null. Systém túto metódu nazýva ako prvú indikáciu toho, že používateľ fragment opúšťa (nemusí to vždy znamenať zničenie fragmentu). Zvyčajne je to v tomto okamihu, kedy musíte vykonať všetky zmeny, ktoré musia byť uložené mimo aktuálnu reláciu používateľa (pretože sa používateľ nemusí vrátiť späť).

Existuje aj niekoľko podtried, ktoré možno bude potrebné rozšíriť namiesto použitia základnej triedy:

Zobrazí plávajúce dialógové okno. Použitie tejto triedy na vytvorenie dialógového okna je dobrou alternatívou k pomocným metódam dialógového okna v triede. Je to tak preto, lebo poskytuje možnosť vložiť dialógové okno fragmentu do operačne riadeného spätného navigačného zásobníka pre fragmenty, čo umožňuje používateľovi vrátiť sa k uzavretému fragmentu. Zobrazenie zoznamu položiek spravovaných napríklad adaptérom je podobné ako v triede. Táto trieda poskytuje niekoľko metód manipulácie so zoznamom zobrazení, napríklad metódu spätného volania na spracovanie kliknutí. Zobrazenie hierarchie objektov ako zoznamu podobného triede. Táto trieda je užitočná pri vytváraní aktivity Nastavenia v aplikácii.

Pridanie používateľského rozhrania

Fragment sa zvyčajne používa ako súčasť používateľského rozhrania aktivity a k aktivite pridáva vlastné rozloženie.

Ak chcete vytvoriť rozloženie pre fragment, musí vývojár implementovať metódu spätného volania, ktorú systém Android zavolá, keď je čas, aby fragment zobrazil svoje rozloženie. Implementácia tejto metódy by mala vrátiť objekt, ktorý je koreňom v rozložení fragmentov.

Poznámka. Ak je fragment podtriedou triedy, predvolená implementácia vráti triedu z metódy, takže nie je potrebné ju implementovať.

Ak chcete vrátiť rozloženie z metódy, môžete ju nafúknuť z toho, čo je definované v súbore XML. Metóda poskytuje na tento účel objekt.

Napríklad kód podtriedy, ktorý načíta rozloženie zo súboru example_fragment.xml, môže vyzerať takto:

Verejná statická trieda ExampleFragment rozširuje Fragment (@Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) (// Nafúknuť rozloženie pre tento fragment vráti inflater.inflate (R.layout.example_fragment, container, false);))

Vytvorenie rozloženia

Vo vyššie uvedenom kóde je konštrukt R.layout.example_fragment odkazom na prostriedok rozloženia s názvom example_fragment.xml uložený v prostriedkoch aplikácie. Podrobnosti o vytváraní rozloženia v XML nájdete v článku.

Príklad operácie, ktorá používa fragment ako vlákno na pozadí bez používateľského rozhrania, je uvedený vo vzorovom kóde FragmentRetainInstance.java, ktorý je súčasťou ukážok súpravy SDK (k dispozícii prostredníctvom správcu Android SDK). Cesta k nemu v systéme je /APIDemos/app/src/main/java/com/example/android/apis/app/FragmentRetainInstance.java.

Správa fragmentov

Na správu fragmentov v aktivite potrebujete triedu. Ak to chcete získať, zavolajte metódu z operačného kódu.

Môžete podniknúť tieto kroky:

  • získať fragmenty dostupné v operácii pomocou metódy (pre fragmenty, ktoré poskytujú používateľské rozhranie v rozložení operácie) alebo (pre oba fragmenty, ktoré majú používateľské rozhranie, aj pre fragmenty bez neho);
  • odstrániť fragmenty z prechodového stohu späť pomocou metódy (napodobňujúcej stlačenie tlačidla) Späť k užívateľ);
  • zaregistrujte proces prijímača zmien v zadnom zásobníku pomocou súboru.

Viac informácií o týchto a ďalších metódach nájdete v dokumentácii triedy.

Ako je uvedené v predchádzajúcej časti, na otvorenie môžete použiť triedu, ktorá vám umožňuje vykonávať fragmentárne transakcie, ako napríklad pridávať a mazať.

Vykonávanie transakcií s fragmentmi

Veľkou výhodou použitia fragmentov v operácii je schopnosť pridávať, odstraňovať, nahrádzať a vykonávať na nich ďalšie akcie v reakcii na vstup používateľa. Akákoľvek skupina zmien vykonaných v operácii sa nazýva transakcia. Dá sa to urobiť pomocou API v. Každá transakcia môže byť uložená v back stacku, ktorý je riadený operáciou. Toto umožní používateľovi prechádzať dozadu zmenami fragmentov (podobne ako pri posune dozadu cez operácie).

Interakcia s operáciou

public static class FragmentA extends ListFragment (OnArticleSelectedListener mListener; ... @Override public void onAttach (Activity activity) (super.onAttach (activity); try (mListener \u003d (OnArticleSelectedListener) activity;) catch (ClassCastException e) (throw new ClassCastException ( activity.toString () + "musí implementovať OnArticleSelectedListener");)) ...)

Ak operácia neimplementovala rozhranie, fragment vyvolá výnimku. Ak bude úspešný, mListener bude obsahovať odkaz na implementáciu aktivity rozhrania OnArticleSelectedListener, aby fragment A mohol zdieľať udalosti s aktivitou vyvolaním metód definovaných rozhraním OnArticleSelectedListener. Napríklad ak je fragment A rozšírením triedy, potom kedykoľvek užívateľ klikne na položku zoznamu, systém zavolá fragment. Táto metóda zase volá metódu onArticleSelected () na zdieľanie udalosti s operáciou:

Verejná statická trieda FragmentA rozširuje ListFragment (OnArticleSelectedListener mListener; ... @Override public void onListItemClick (ListView l, View v, int position, long id) (// Pripojí ID riadku kliknutej položky k poskytovateľovi obsahu Uri Uri noteUri \u003d ContentUris. (ArticleColumns.CONTENT_URI, id); // Odošle udalosť a Uri na aktivitu hostiteľa mListener.onArticleSelected (noteUri);) ...)

Parameter id odovzdaný metóde je identifikátor riadku s vybranou položkou zoznamu, ktorý operácia (alebo iný fragment) používa na získanie článku z objektu aplikácie.

Ďalšie informácie o práci s poskytovateľom obsahu nájdete v dokumente.

Pridávanie položiek na panel akcií

Fragmenty môžu implementáciou pridať položky ponuky do operácií (a teda aj do). Aby však táto metóda mohla prijímať hovory, musí sa volať za behu, aby sa naznačilo, že fragment má v úmysle pridať položky do ponuky Možnosti (inak fragment neprijme volanie metódy).

Všetky položky pridané fragmentom do ponuky Možnosti sa pridajú k existujúcim položkám. Fragment navyše prijíma spätné volania metód, keď užívateľ vyberie položku ponuky.

Vývojár môže tiež zaregistrovať zobrazenie s rozložením ich fragmentu a poskytnúť tak kontextové menu. Ak to chcete urobiť, zavolajte metódu. Keď používateľ otvorí kontextové menu, fragment prijme volanie metódy. Keď používateľ vyberie položku ponuky, fragment prijme volanie metódy.

Poznámka. Aj keď fragment prijme spätné volanie udalosti „položka vybraná“ pre každú položku, ktorú pridá, operácia prijme príslušné spätné volanie najskôr, keď používateľ vyberie položku ponuky. Ak implementácia spätného volania udalosti „položka ponuky vybratá“ nespracuje vybranú položku, udalosť sa predá metóde spätného volania vo fragmente. Platí to pre ponuky Option a skratkové ponuky.

Podrobnosti o ponukách nájdete v príručkách pre vývojárov a

Správa životného cyklu fragmentov

Obrázok 3... Vplyv životného cyklu činnosti na životný cyklus fragmentu

Správa životného cyklu fragmentov je veľmi podobná správe životného cyklu aktivít. Rovnako ako operácia, fragment môže existovať v jednom z troch stavov:

Obnovené Fragment je viditeľný počas operácie. Pozastavené Prebieha iná operácia, ktorá je zameraná na popredie, ale operácia obsahujúca tento fragment je stále viditeľná (operácia na popredí je čiastočne priehľadná alebo nevyplňuje celú obrazovku). Zastavené Fragment nie je viditeľný. Buď je prevádzka kontajnera zastavená, alebo bol z nej fragment odstránený, ale pridaný späť do navigačného zásobníka. Zastavený fragment je stále aktívny (všetky informácie o stave a prvkoch sú uložené v systéme). Už to však pre používateľa nie je viditeľné a v prípade zničenia operácie sa zničí.

Opäť je tu vidieť analógiu s operáciou: vývojár môže s pomocou zachrániť stav fragmentu v prípade, že dôjde k zničeniu procesu operácie, a vývojár musí obnoviť stav fragmentu po opätovnom vytvorení operácie. Stav je možné uložiť počas vykonávania metódy spätného volania vo fragmente a obnoviť ho za behu, príp. Viac informácií o vytrvalosti nájdete v dokumente.

Najvýznamnejším rozdielom počas životného cyklu medzi aktivitou a fragmentom je to, ako sú uložené v príslušných spätných vetvách. Predvolene sa aktivita pri zastavení zastaví do zásobníka spravovaného systémom, ktorý umožňuje operácie (aby sa k nej používateľ mohol vrátiť pomocou príkazu Späť kako je popísané v článku). Fragment sa súčasne vloží do operačného zásobníka back stack iba vtedy, keď vývojár výslovne požaduje, aby sa konkrétna inštancia uložila volaním metódy počas transakcie, ktorá fragment odstráni.

V opačnom prípade je správa životného cyklu fragmentu veľmi podobná správe životného cyklu činnosti. Preto sa pokyny pre osvedčené postupy vzťahujú aj na fragmenty. Zároveň musí vývojár pochopiť, ako životný cyklus operácie ovplyvňuje životný cyklus fragmentu.

Pozor! Ak potrebujete objekt vo vnútri objektu triedy, môžete zavolať metódu. Vývojár by však mal byť opatrný, aby metódu zavolal, iba ak je fragment pripojený k aktivite. Ak fragment ešte nie je pripojený alebo bol na konci svojho životného cyklu odpojený, metóda vráti hodnotu null.

Zosúladenie s životným cyklom operácie

Životný cyklus aktivity, ktorá obsahuje fragment, priamo ovplyvňuje životný cyklus fragmentu, takže každé spätné volanie v rámci životného cyklu aktivity má za následok podobné spätné volanie pre každý fragment. Napríklad, keď operácia prijme hovor, každá jej časť prijme.

Fragmenty však majú niekoľko ďalších metód spätného volania životného cyklu, ktoré poskytujú jedinečnú interakciu s aktivitou na vykonávanie akcií, ako je vytváranie a ničenie používateľského rozhrania fragmentu. Ide o tieto metódy:

OnCreate (), fragment vo vnútri tejto operácie vyžaduje iba metódu spätného volania.

Keď sa operácia dostane do stavu „obnovená“, môžete do nej ľubovoľne pridávať a odstraňovať fragmenty. Životný cyklus fragmentu je teda možné nezávisle meniť iba vtedy, keď operácia zostáva v „obnovenom“ stave.

Keď však aktivita opustí tento stav, pokrok fragmentu počas jeho životného cyklu sa opäť uskutoční pomocou aktivity.

Príklad:

Ak chcete zhrnúť, čo bolo povedané v tomto dokumente, zvážte príklad operácie, ktorá pomocou dvoch úryvkov vytvorí dvojpanelové rozloženie. Operácia, ktorej kód je uvedený nižšie, obsahuje jeden fragment na zobrazenie zoznamu Shakespearových hier a ďalší na zobrazenie súhrnu hry vybranej zo zoznamu. Príklad ukazuje, ako usporiadať rôzne konfigurácie fragmentov v závislosti od konfigurácie obrazovky.

Poznámka. Kompletný zdrojový kód pre túto operáciu je v tejto časti.

Hlavná operácia aplikuje rozloženie obvyklým spôsobom, spôsobom:

@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.fragment_layout);)

Tu je použité rozloženie fragment_layout.xml:

Pomocou tohto rozloženia systém vytvorí inštanciu triedy (playlist) TitlesFragment, akonáhle operácia načíta rozloženie. V takom prípade sa objekt (v ktorom sa bude nachádzať fragment so súhrnom) odohráva na pravej strane obrazovky, ale spočiatku zostáva prázdny. Ako uvidíte ďalej, fragment sa nezmestí, kým si používateľ nevyberie položku v zozname.

Nie všetky obrazovky sú však dostatočne široké na to, aby sa vedľa zoznamu skladieb zobrazil ich súhrn. Vyššie uvedené rozloženie sa preto používa iba v orientácii na šírku a je uložené v súbore res / layout-land / fragment_layout.xml.

Keď je zariadenie v orientácii na výšku, systém použije nižšie uvedené rozloženie, ktoré je uložené v rez / layout / fragment_layout.xml:

Toto rozloženie obsahuje iba objekt TitlesFragment. To znamená, že keď je zariadenie v orientácii na výšku, je viditeľný iba zoznam skladieb. Keď používateľ klikne na položku zoznamu v tejto konfigurácii, aplikácia spustí novú aktivitu, aby namiesto načítania druhého úryvku zobrazila súhrn.

Ďalej vidíte, ako sa to implementuje v triedach fragmentov. Najskôr prichádza kód pre triedu TitlesFragment, ktorý zobrazuje zoznam Shakespearových hier. Tento úryvok je rozšírením triedy a pomocou svojich funkcií robí základné práce so zoznamom.

Pri skúmaní kódu si všimnite, že existujú dve možné správania v reakcii na to, že používateľ klikne na položku zoznamu. V závislosti na tom, ktoré z týchto dvoch usporiadaní je aktívne, sa v rámci jednej operácie vytvorí a zobrazí nový fragment so súhrnom (pridaním fragmentu k objektu) alebo sa spustí nová operácia (zobrazenie fragmentu).

Druhý fragment, DetailsFragment, zobrazuje súhrn hry vybranej v zozname TitlesFragment:

Pripomeňme si kód pre triedu TitlesFragment: ak používateľ klikne na položku zoznamu a aktuálne rozloženie nie obsahuje pohľad R.id.details (ktorý vlastní DetailsFragment), aplikácia spustí DetailsActivity na zobrazenie obsahu prvku.

Verejná statická trieda DetailsActivity rozširuje aktivitu (@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); if (getResources (). GetConfiguration (). Orientation \u003d\u003d Configuration.ORIENTATION_LANDSCAPE) (// Ak je obrazovka teraz v v režime na šírku môžeme zobraziť // dialógové okno v súlade so zoznamom, takže túto aktivitu nepotrebujeme. finish (); return;) if (savedInstanceState \u003d\u003d null) (// Počas počiatočného nastavenia pripojte podrobnosti fragment. DetailsFragment details \u003d nový DetailsFragment (); details.setArguments (getIntent (). getExtras ()); getFragmentManager (). beginTransaction (). add (android.R.id.content, details) .commit ();)) )

Upozorňujeme, že v konfigurácii na šírku sa táto operácia dokončí, takže hlavná operácia môže prevziať a zobraziť PodrobnostiFragment vedľa položky TitlesFragment. To sa môže stať, ak používateľ spustí PodrobnostiActivity v orientácii obrazovky na výšku a potom zariadenie otočí na šírku (čo spôsobí reštartovanie aktuálnej aktivity).

Ďalšie ukážky kódu pomocou úryvkov (a úplné zdrojové súbory pre tento príklad) sú k dispozícii v ukážkovej aplikácii Demos API (z ktorej je možné stiahnuť).

Pre všeobecné pochopenie som sa tiež rozhodol študovať životný cyklus fragmentu v spojení s životným cyklom aktivity, ktorá nastane, keď je aktivita s fragmentom spustená a zničená. Ukázalo sa nasledovné:


Zoznam metód zachytených fragmentov

V takmer každej aplikácii sa používajú tri hlavné metódy:

onCreate - inicializácia vnútorných komponentov fragmentu s uloženými údajmi.

onCreateView - vytvorenie komponentu na zobrazenie.

onPause - riešenie situácie, keď fragment stratí zameranie.

Popis všetkých metód v poradí, v akom sa volajú:

onAttach - prvé spojenie fragmentu s činnosťou. Sem sa prenáša aktivita, ku ktorej dôjde k spojeniu.

onCreate - inicializácia fragmentu. Toto je miesto, kde sa na obnovenie tohto stavu odovzdávajú údaje triedy zväzku o poslednom stave fragmentu v jeho predchádzajúcom živote, ak existujú, uložené skôr, napríklad v metóde onSaveInstanceState. V tomto okamihu je aktivita stále v procese vytvárania.

onCreatevyhliadka - vytvorenie výhľadu pre zobrazenie. Vráti pohľad na fragment. Môže sa vrátiťnulový pre nevizuálne komponenty. Toto je miesto, kde sa odovzdávajú údaje triedy Bundle o poslednom stave fragmentu, ako aj kontajner aktivity, kde budú spojené fragment a značkovací „nafukovač“.

navyhliadkaVytvoriťd - volá sa, keď sa vytvorí pohľad. Tu sa odovzdá vygenerované zobrazenie a údaje triedy Bundle o poslednom stave fragmentu. Používa sa na konečnú inicializáciu zobrazenia pred obnovením uloženého stavu. V tomto okamihu ešte pohľad nie je pripojený k fragmentu.

onActivityCreated - konečná inicializácia. Volá sa, keď sa vrátila metóda onCreate () aktivity. Aktivita je vytvorená, je do nej vložený fragment. Používa sa napríklad na obnovenie stavu fragmentu. Toto je miesto, kde sa odovzdávajú údaje zväzku o poslednom stave fragmentu.

onViewStateRestored - inicializácia pohľadu na základe uloženého stavu. Volá sa po obnovení stavu uloženého zobrazenia.

onSaveInstanceState - uloženie stavu fragmentu. Vystrelí, iba ak sa fragment zastaví a systém ich môže zabiť, ale v skutočnosti je to stále potrebné. Stáva sa to napríklad pri vyvolaní ďalšej aktivity, po stlačení tlačidla „domov“, ako aj v prípade úplného zničenia aktivity a jej vytvorenia opäť v dôsledku zmeny konfigurácie zariadenia (zmena jazyka, vstupného zariadenia, orientácie obrazovky atď.). Objekt Bundle obsahujúci stav aktivity sa odovzdáva metódam onCreate, onPostCreate a onRestoreInstanceState. Pozor! Metódu je možné zavolať kedykoľvek predtýmonDestroy!

onDestroyView - volá sa, keď je pohľad odpojený od fragmentu. Pri ďalšom zobrazení fragmentu sa vygeneruje nové zobrazenie.

onDetach - zavolal pred odpojením fragmentu od aktivity.