Předávání dat mezi fragmenty Androidu. Pokračování je dostupné pouze pro předplatitele. Přidávání položek na panel akcí

Vytvořit dobré uživatelské rozhraní je obtížné, zvláště pokud v tomto oboru ještě nemáte mnoho zkušeností. Takže tady na vás rychlý test znát otázku: pokud jste zvyklí na to, že nové okno nutně vyžaduje Aktivitu nebo místo ní plynulá animace Z nějakého důvodu se v čerstvě napsaném programu objevují křeče - tento článek je pro vás :)

Rake Activity

Většina výukových programů demonstrujících triky vývoje pro Android začíná stejným způsobem: nezkušení vývojáři jsou požádáni, aby napsali vše vizuální prvky přímo do značky XML hlavní aktivity. Vypadá to nějak takto:

Veřejná třída MainActivity rozšiřuje AppCompatActivity ( @Override protected void onCreate(Bundle SavedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ...

Tento druh designu se stává zvykem a projekt je naplněn novými aktivitami se stále složitějším značením. Ve výsledku - i minimálně užitečná aplikace zaroste hromádkou aktivit a pohltí vše BERAN a kameny a dvojky létají na vývojáře na Google Play.

A to vše proto, že OS Android neslibuje, že udrží vaše aktivity naživu. Jak si pamatujete, tyto komponenty existují nezávisle na sobě a mají zvláštní životní cyklus. Pokud Aktivita přejde do stavu OnPause, a to se stává poměrně často, stává se Schrödingerovou kočkou: nemůžete předem vědět, zda bude naživu nebo ne.

Použitím doplňkových Aktivity k zobrazení menu a dalších drobností ohrožujete vše logické souvislosti uvnitř aplikace. Aktivity se shromažďují na zásobníku a OS je může začít vykládat jednu po druhé nebo ve skupině. Když se uživatel chce vrátit do předchozího okna, může být Aktivita již zničena a uživatel vypadne z aplikace.

Kromě problémů se zachováním logiky je zde také rutina podpory OOP kódu: rozhraní pevně svázaná s Activity je téměř nemožné dále vyvíjet. škálování, rychlá výměna některé prvky k jiným, animace - to vše bude v nových verzích aplikace velmi obtížné implementovat.

Díky módě pro jednotný ekosystém, všechno mobilní aplikace byly obecně velmi podobné. Stačí si najít cestu a trochu cvičit, a pak začne kvalita rychle růst. Podle principu „kritizovat – navrhovat“ nyní napíšeme aplikaci, která implementuje univerzální uživatelské rozhraní. To bude zajímavé nejen z akademického hlediska – jsem si jistý, že dnes napsaný kód můžete snadno integrovat do svých projektů. Pojďme tedy začít!

Fragmenty

Aby byla práce s uživatelským rozhraním jednodušší a rychlejší, vytvořil Google Fragment – ​​třídu – vrstvu mezi Aktivitou a vizuálními komponentami programu. Na jedné straně je to kontejner pro libovolné objekty View, které lze uživateli zobrazit. Na druhou stranu je zde pokračování Aktivity, ze které Fragment dostává veškeré informace o změnách v životním cyklu.

Fragmenty, jako je Activity, mají své vlastní (i když originálnější) životní cyklus. Například není možné pracovat s uživatelským rozhraním ihned po vytvoření fragmentu, musíte počkat na načtení všech prvků - po metodě onCreate se provede metoda onCreateView, kam lze prvky načíst.

Veřejná třída FragmentOne rozšiřuje Fragment ( ... public View onCreateView(...) ( Zobrazit pohled=inflater.inflate(R.layout.fragment_one, container,false);

TextView textView = (TextView)view.findViewById(R.id.fo_text);

textView.setText("Ahoj, jsem první fragment!"); vrátit pohled; ...

Ve fragmentu můžete také přepsat jakékoli metody, které sledují stav okna. Pokud tedy aplikace přejde na pozadí, v Aktivitě se provede onPause a zde se pak provede metoda s přesně stejným názvem. To může být užitečné – vhodné pro odpojení od objektů třetích stran, jako jsou například vázané služby.

FragmentTransaction

Google věděl, že práce s fragmenty bude intenzivní, vytvořil pro to předem speciální nástroje. Třídy FragmentManager a FragmentTransaction shromažďují všechny procesy: vytváření nových fragmentů a jejich odstraňování, přenos dat a tak dále.

Objekt FragmentManager není potřeba vytvářet, ten již existuje v každé Aktivitě, stačí na něj získat odkaz. A všechny akce projdou FragmentTransaction , která pak nezávisle přenese data do správce fragmentů. Správce FragmentManager = getSupportFragmentManager(); Transakce FragmentTransaction = manager.beginTransaction(); Rád bych poznamenal, že třídy, které pracují s fragmenty, jsou dostupné ve dvou verzích. Doporučuji použít více velká knihovna vytvořené pro organizaci zpětná kompatibilita. Společnost Google zachází se zařízeními opatrně na všech verzích OS a knihovny umožňují využívat vývojové novinky i při práci se starým API.

Importovat android.support.v4.app.FragmentTransaction; importovat android.support.v4.app.Fragment;...

FrameLayout

Data v uživatelském rozhraní často přicházejí dynamicky v závislosti na probíhajících událostech. Abyste měli kam umístit obrázek nebo text, existuje speciální kontejner - FrameLayout. To je jeho hlavní úkol – vyhradit místo na obrazovce pro libovolný objekt třídy View, který lze později načíst. V takových nádobách žijí i úlomky.

Nový fragment můžete do FrameLayout přidat různými způsoby: FragmentTransaction má podobnou funkci pro nahrazení a přidání metod.

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

Navzdory vnější podobnosti musíte dobře rozumět tomu, jakých výsledků můžete dosáhnout. Metoda nahrazení funguje velmi jednoduše – přidá fragment a pokud v kontejneru dříve něco bylo, staré fragmenty smaže.

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

Metoda add vytvoří zásobník fragmentů a každý z nich nová výzva vloží novou instanci na vrchol zásobníku. Je důležité, aby když se objeví nový fragment, staré objekty v zásobníku neobdržely žádná upozornění a chovaly se, jako by se nic nestalo. To znamená, že pro ně nebude provedena metoda onPause a budou nadále spotřebovávat prostředky zařízení, ačkoli je uživatel již neuvidí.

Takové plýtvání alokovanou pamětí lze odůvodnit například tím, že chcete zorganizovat předzpracování dat: fragment může něco načíst, když je neviditelný, a poté ukázat hotový výsledek.

Může existovat několik akcí s fragmenty, které se budou hromadit, dokud nebude provedena metoda odevzdání.

Transaction.commit();

Pokračování je dostupné pouze pro předplatitele

Možnost 1. Chcete-li si přečíst všechny materiály na webu, přihlaste se k odběru Hacker

Předplatné vám umožní číst VŠECHNY placené materiály na webu ve stanovené lhůtě. Přijímáme platbu bankovních karet

, elektronické peníze a převody z účtů mobilních operátorů. Dotkli jsme se tématu přechodu mezi Aktivity v aplikacích pro Android. A zejména jsme diskutovali o přenosu dat z jedné aktivity do druhé. Jasné řešení slouží nám dobře, pokud předáváme data „jednoduchých“ typů: String, int, long nebo pole. Jakmile se ale pokusíme přenést objekt z našeho datového modelu tímto způsobem, začnou potíže.
Objekty lze přenášet tímto způsobem, ale musí implementovat rozhraní Serializable nebo Parcelable. První možnost podle některých recenzí, které jsem našel, snižuje výkon aplikace. Za druhé – pojďme se na to podívat blíže.
Zde je příklad třídy z jedné z mých aplikací:

  1. public class Email implementuje Parcelable (
  2. adresa soukromého řetězce;
  3. private String type;
  4. soukromý e-mail (balíček) (
  5. tato .adresa = v .readString();
  6. tento .type = v .readString();
  7. veřejný řetězec getAddress() (
  8. zpáteční adresa;
  9. public void setAddress(adresa řetězce) (
  10. toto .adresa = adresa;
  11. veřejný řetězec getType() (
  12. návratový typ;
  13. public void setType(String t) (
  14. tento .typ = t;
  15. veřejný e-mail (řetězec a, řetězec t) (
  16. tato.adresa = a;
  17. tento .typ = t;
  18. public int descriptionContents() (
  19. návrat 0;
  20. public static final Parcelable.Creator CREATOR = new Parcelable.Creator() (
  21. veřejný email createFromParcel(Parcel in ) (
  22. vrátit nový Email(in);
  23. veřejný e-mail newArray(int size) (
  24. vrátit nový e-mail;
  25. public void writeToParcel(Parcel package, int i) (
  26. parcela.writeString(adresa);
  27. parcela.writeString(typ);
Jak vidíte, implementuje rozhraní Parcelable, což znamená, že jej lze snadno přenášet mezi aktivitami. Jak toho dosáhneme? Logiku třídy doplňujeme metodami pro její Parcelizaci a Deparcelizaci, jinými slovy její uložení do Parcelu a obnovení z něj. Zásilku zde lze považovat za jakousi vyrovnávací paměť, do které můžete přidat v určitém pořadí data libovolného typu a poté je (ve stejném pořadí!) odtud extrahujte.
Ukládání obsahu polí třídy v Parcelu je velmi jednoduché. To je implementováno v metodě writeToParcel. Pro obnovu objektu postupujeme následovně: Vytvoříme vnořenou třídu Parcelable.Creator, ve které implementujeme dvě metody. Ten druhý vypadá vždy stejně, ale ten první je pro nás velmi důležitý: způsobí nový konstruktér naší třídy, předávání Parcel. V konstruktoru musíme implementovat logiku, obrácená metoda writeToParcel , tzn. odečtěte hodnoty polí třídy z Parcel ve stejném pořadí, v jakém tam byly zapsány. V případě jednoduchých polí zadejte řetězec není to těžké. Pokud máme pole typu ArrayList, uděláme toto:
p.writeInt(phone.size());
for (int i = 0; i< phone.size(); i++) {
p.writeString(phone.get(i));
}
pro uchování a
int pocet = p.readInt();
for (int i = 0; i< count; i++) {
String ph = p.readString();
telefon.add(ph);
}
pro zotavení. Zde p, jak jste pravděpodobně uhodli, je objekt třídy Parcel a phone je pole typu ArrayList.
Pokud jsou obory naší třídy našimi ostatními třídami, pak je také musíme „naučit parcelovat“. Poté pole takových typů umístíme do Parcelu metodou
p .writeParcelable(organizace, Parcelable.CONTENTS_FILE_DESCRIPTOR);
a extrahujte odtud pomocí metody
organizace = p .readParcelable(getClass().getClassLoader());

Obrázek 2Životní cyklus fragmentu (během provádění operace)

Chcete-li vytvořit fragment, musíte podtřídu třídy (nebo její existující podtřídu). Třída má kód podobný . Obsahuje metody zpětné volání, podobné operačním metodám jako , a . V praxi, pokud potřebujete převést existující aplikace pro Android aby používal fragmenty, jednoduše přesunete kód z metod zpětného volání operace do odpovídajících metod zpětného volání fragmentu.

Obvykle musíte implementovat následující metody životního cyklu:

Systém volá tuto metodu, když vytváří fragment. Ve své implementaci musí návrhář inicializovat klíčové komponenty fragmentu, které je třeba zachovat, když je fragment pozastaven nebo obnoven po zastavení. Systém volá tuto metodu při prvním zobrazení uživatelské rozhraní

fragment na displeji. Pro vykreslení uživatelského rozhraní fragmentu by tato metoda měla vrátit , což je kořenový objekt v rozložení fragmentu. Pokud fragment nemá uživatelské rozhraní, můžete vrátit hodnotu null. Systém volá tuto metodu jako první indikaci, že uživatel fragment opouští (ne vždy to znamená, že fragment je zničen). To je obvykle čas na potvrzení jakýchkoli změn, které je třeba uložit mimo aktuální relaci uživatele (protože uživatel nemusí být schopen se vrátit). :

Zobrazte pohyblivé dialogové okno. Použití této třídy k vytvoření dialogového okna je dobrou alternativou k pomocným metodám dialogového okna v . Je to proto, že poskytuje možnost vložit dialog fragmentu do operačně řízeného zpětného zásobníku pro fragmenty, což uživateli umožňuje vrátit se k uzavřenému fragmentu.

Zobrazení seznamu prvků spravovaných adaptérem (jako je ) je podobné jako u . Tato třída poskytuje několik metod pro správu seznamu pohledů, jako je metoda zpětného volání pro zpracování kliknutí.

Zobrazení hierarchie objektů ve formě seznamu, podobně jako . Tato třída je užitečná při vytváření operace Nastavení v aplikaci.

Přidání uživatelského rozhraní Fragment se obvykle používá jako součást uživatelského rozhraní aktivity a přidává k aktivitě vlastní rozvržení. K vytvoření rozložení pro fragment musí vývojář implementovat metodu zpětného volání, která

systém Android Volá se, když je čas, aby fragment vykreslil své rozložení. Implementace této metody musí vrátit objekt, který je kořenem rozvržení fragmentu.

Poznámka.

Pokud je fragment podtřídou třídy, výchozí implementace vrátí třídu z metody, takže ji není potřeba implementovat.

Chcete-li vrátit rozložení z metody, můžete jej nafouknout z metody definované v souboru XML. Pro tento účel metoda poskytuje . Například kód pro podtřídu třídy, která načte rozložení z example_fragment.xml, může vypadat takto: Veřejnost

statická třída

ExampleFragment rozšiřuje Fragment ( @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle SaveInstanceState) ( // Nafoukněte rozložení pro tento fragment return inflater.inflate(R.layout.example_fragment, container, false); ) ) Vytvoření rozvržení V níže uvedeném kódu je konstrukce R.layout.example_fragment odkazem na prostředek rozvržení s názvem example_fragment.xml uložený ve zdrojích aplikace.

Podrobnosti Chcete-li vytvořit rozložení v XML, přečtěte si článek.

Příklad operace, která používá fragment jako vlákno na pozadí, bez uživatelského rozhraní, najdete v ukázce kódu FragmentRetainInstance.java, která je součástí ukázek SDK (a přístupná prostřednictvím Správce SDK pro Android). Cesta k němu v systému je

Ke správě fragmentů v operaci potřebujete třídu. Chcete-li to získat, musíte metodu zavolat z operačního kódu.

Níže jsou uvedeny akce, které můžete provést:

  • získat fragmenty přítomné v aktivitě pomocí metody (pro fragmenty, které poskytují uživatelské rozhraní v rozložení aktivity) nebo (pro oba fragmenty, které mají uživatelské rozhraní, i pro fragmenty bez něj);
  • odstraňte fragmenty ze stohu přechodů pomocí zpětné metody (simulace stisknutí tlačítka Zadní uživatel);
  • zaregistrujte proces posluchače změn v zadním zásobníku pomocí .

Více informací Tyto a další metody jsou popsány v dokumentaci třídy.

Jak je uvedeno v předchozí části, můžete použít třídu Open, která vám umožňuje provádět transakce s fragmenty, jako je přidávání a odstraňování.

Provádění transakcí s fragmenty

Velkou výhodou použití fragmentů v operaci je možnost přidávat, odstraňovat, nahrazovat a dělat s nimi další věci v reakci na vstup uživatele. Jakákoli sada změn provedených v operaci se nazývá transakce. To lze provést pomocí rozhraní API v . Každá transakce může být uložena v záložním zásobníku, který je řízen operací. To uživateli umožní pohybovat se zpět prostřednictvím změn ve fragmentech (podobně jako při pohybu zpět prostřednictvím činností).

Interakce s provozem

public static class FragmentA rozšiřuje ListFragment ( OnArticleSelectedListener mListener; ... @Override public void onAttach(Activity activity) ( super.onAttach(activity); try ( mListener = (OnArticleSelectedListener) aktivita; ) catch (ClassCastException e) ( throw new ClassCastException( activity.toString() + "musí implementovat OnArticleSelectedListener" ) ) ... )

Pokud operace neimplementovala rozhraní, fragment vyvolá výjimku. Pokud bude úspěšný, prvek mListener bude obsahovat odkaz na implementaci operace rozhraní OnArticleSelectedListener, takže Fragment A může sdílet události s operací voláním metod definovaných rozhraním OnArticleSelectedListener. Pokud je například fragment A rozšířením třídy , pak kdykoli uživatel klikne na položku seznamu, systém zavolá fragment. Tato metoda zase volá metodu onArticleSelected() k použití události ve spojení s operací:

Veřejná statická třída FragmentA rozšiřuje ListFragment ( OnArticleSelectedListener mListener; ... @Override public void onListItemClick(ListView l, View v, int position, long id) ( // Připojte ID řádku kliknuté položky k poskytovateli obsahu Uri Uri noteUri = ContentUris (ArticleColumns.CONTENT_URI, id) // Odešlete událost a Uri do hostitelské aktivity mListener.onArticleSelected(noteUri) ... )

Parametr id předaný metodě je ID řádku obsahujícího vybranou položku seznamu, kterou operace (nebo jiný fragment) používá k načtení článku z aplikačního objektu.

Další informace o spolupráci s poskytovatelem obsahu naleznete v dokumentu.

Přidávání položek na panel akcí

Fragmenty mohou přidávat položky nabídky do aktivit (a tedy do ) implementací . Aby však tato metoda přijímala volání, musí být volána za běhu, aby naznačila, že fragment zamýšlí přidat položky do nabídky Možnosti (jinak fragment volání metody nepřijme).

Všechny položky přidané fragmentem do nabídky Možnosti se přidají ke stávajícím. Fragment navíc přijímá zpětná volání metody, když uživatel vybere položku nabídky.

Vývojář může také zaregistrovat pohled do rozvržení svého fragmentu, aby jej poskytl kontextové menu. Chcete-li to provést, zavolejte metodu. Když uživatel otevře kontextovou nabídku, fragment přijme volání metody. Když uživatel vybere položku nabídky, fragment obdrží volání metody.

systém Android Ačkoli fragment přijme zpětné volání v události "položka nabídky vybrána" pro každou položku, kterou přidá, aktivita nejprve obdrží odpovídající zpětné volání, když uživatel vybere položku nabídky. Pokud stávající implementace zpětného volání aktivity pro vybranou událost položky nabídky nezpracovává vybranou položku, je událost předána metodě zpětného volání ve fragmentu. To platí pro nabídky možností a kontextové nabídky.

Podrobné informace o nabídce naleznete v příručkách pro vývojáře a

Správa životního cyklu fragmentů

Obrázek 3. Vliv životního cyklu aktivity na životní cyklus fragmentu

Správa životního cyklu fragmentu je v mnoha ohledech podobná správě životního cyklu operace. Stejně jako operace může fragment existovat v jednom ze tří stavů:

Obnoveno Fragment je viditelný během operace. Pozastaveno Jiná aktivita běží a má fokus v popředí, ale aktivita obsahující fragment je stále viditelná (aktivita popředíčástečně průhledný nebo nezabírá celou obrazovku). Zastaveno Fragment není vidět. Buď se operace kontejneru zastavila, nebo z něj byl fragment odstraněn, ale přidán do zadního zásobníku. Zastavený fragment je stále aktivní (všechny informace o stavu a prvcích jsou uloženy v systému). Pro uživatele však již není viditelný a v případě zničení operace bude zničen.

Zde je opět viditelná analogie s operací: vývojář může uložit stav fragmentu s pomocí v případě zničení procesu operace a vývojář potřebuje obnovit stav fragmentu, když rekreace operace. Stav lze uložit během provádění metody zpětného volání ve fragmentu a obnovit během provádění , nebo . Další informace o persistenci naleznete v dokumentu.

Nejvýznamnějším rozdílem životního cyklu mezi operací a fragmentem je způsob jejich uložení v příslušných backstacích. Ve výchozím nastavení je operace umístěna do systémem spravovaného záložního zásobníku pro operace, když se zastaví (aby se k ní uživatel mohl vrátit pomocí tlačítka Zadní, jak je popsáno v článku). Současně je fragment umístěn na operačním back stack pouze tehdy, když vývojář výslovně požaduje uložení konkrétní instance voláním metody během transakce, která odstraní fragment.

Jinak je správa životního cyklu fragmentu velmi podobná správě životního cyklu operace. Proto praktická doporučení jsou také použitelné pro fragmenty. Vývojář zároveň potřebuje pochopit, jak životní cyklus operace ovlivňuje životní cyklus fragmentu.

Pozor! Pokud potřebujete objekt uvnitř objektu třídy, můžete zavolat . Vývojář však musí dávat pozor, aby metodu volal pouze tehdy, když je fragment připojen k aktivitě. Pokud fragment ještě není připojen nebo byl na konci svého životního cyklu odpojen, metoda vrátí hodnotu null.

Soulad s životním cyklem činnosti

Životní cyklus aktivity obsahující fragment přímo ovlivňuje životní cyklus fragmentu, takže každé zpětné volání životního cyklu aktivity vede k podobnému zpětnému volání pro každý fragment. Když například operace přijme volání, každý její fragment přijme .

Fragmenty však mají několik doplňkové metody Zpětná volání životního cyklu, která poskytují jedinečnou interakci s operací k provádění akcí, jako je vytvoření a zničení fragmentu uživatelského rozhraní. Jsou to tyto metody:

OnCreate() , fragment uvnitř této operace používá pouze metodu zpětného volání.

Když operace přejde do stavu „obnovení“, můžete do ní libovolně přidávat a odebírat fragmenty. Životní cyklus fragmentu lze tedy nezávisle upravovat pouze v době, kdy operace zůstává ve stavu „obnovení“.

Když však operace opustí tento stav, postup fragmentu jeho životním cyklem opět provede operace.

Příklad:

Abychom shrnuli vše, co je popsáno v tomto dokumentu, podívejme se na příklad operace, která používá dva fragmenty k vytvoření dvoupanelového rozvržení. Níže uvedená operace zahrnuje jeden fragment pro zobrazení seznamu Shakespearových her a další pro zobrazení souhrnu hry vybrané ze seznamu. Příklad ukazuje, jak by měly být organizovány různé konfigurace fragmentů v závislosti na konfiguraci obrazovky.

systém Android Kompletní zdrojový kód této operace je v sekci.

Hlavní operace platí rozložení obvyklým způsobem, v metodě:

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

Zde se používá rozvržení fragment_layout.xml:

Pomocí tohoto rozložení systém vytvoří instanci třídy TitlesFragment (seznam přehrávání), jakmile operace načte rozložení. V tomto případě objekt (který bude obsahovat fragment se shrnutím) zabírá místo na pravé straně obrazovky, ale zpočátku zůstává prázdný. Jak bude ukázáno níže, fragment není umístěn, dokud uživatel nevybere položku v seznamu.

Ne všechny obrazovky jsou však dostatečně široké pro zobrazení shrnutí vedle seznamu her. Proto je výše popsané rozložení použito pouze v orientaci obrazovky na šířku a je uloženo v souboru res/layout-land/fragment_layout.xml.

Když je zařízení v orientaci na výšku, systém použije níže uvedené rozložení, které je uloženo v souboru res/layout/fragment_layout.xml:

V tomto rozložení je přítomen pouze objekt TitlesFragment. To znamená, že když je zařízení v orientaci na výšku, je viditelný pouze seznam přehrání. Když uživatel klepne na položku seznamu v této konfiguraci, aplikace spustí novou aktivitu, aby zobrazila souhrn, místo aby načítala druhý fragment.

Dále můžete vidět, jak je to implementováno ve třídách fragmentů. Na začátku kód přichází class TitlesFragment , zobrazující seznam Shakespearových her. Tento fragment rozšiřuje třídu a využívá její funkce k základní práci se seznamem.

Při zkoumání kódu si všimněte, že v reakci na kliknutí uživatele na položku seznamu existují dvě možná chování. V závislosti na tom, které ze dvou rozložení je aktivní, se buď vytvoří nový fragment se souhrnem a zobrazí se jako součást jediné operace (přidáním fragmentu do objektu), nebo se spustí nový provoz(zobrazení fragmentu).

Druhý fragment, DetailsFragment, zobrazuje souhrn přehrávání vybraného v seznamu TitlesFragment:

Připomeňme si kód třídy TitlesFragment: pokud uživatel klikne na položku seznamu, a aktuální rozložení Ne obsahuje pohled R.id.details (který vlastní DetailsFragment), pak aplikace spustí DetailsActivity, aby se zobrazil obsah prvku.

Veřejná statická třída DetailsActivity rozšiřuje aktivitu ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) ( // Pokud je obrazovka nyní v režimu na šířku, můžeme zobrazit // dialogové okno v souladu se seznamem, takže tuto aktivitu nepotřebujeme. finish(); return; ) if (savedInstanceState == null) ( // Během počátečního nastavení zapojte podrobnosti fragment. PodrobnostiFragmentu = new DetailsFragment().setArguments(getIntent().getExtras());

Všimněte si, že v konfiguraci na šířku se tato aktivita dokončí sama, takže hlavní aktivita může převzít kontrolu a zobrazit DetailsFragment vedle TitlesFragment . K tomu může dojít, pokud uživatel spustí DetailsActivity v orientaci na výšku a poté převrátí zařízení orientace na šířku(což způsobí restartování aktuální operace).

Další ukázky kódu pomocí fragmentů (a celých souborů) zdrojový kód tento příklad) jsou k dispozici v ukázkové aplikaci Demos API (kterou lze stáhnout z ).




Nahoru