Fragmenty představují výkonný nástroj pro vývoj uživatelského rozhraní v Android aplikacích, který umožňuje rozdělit obrazovku na menší, opakovaně použitelné sekce. Tento koncept je zásadní pro aplikace, které potřebují flexibilitu a efektivní správu různých částí uživatelského rozhraní. V tomto textu se zaměříme na to, jak fragmenty fungují, jak je používat a jak je dynamicky přidávat a odebírat během běhu aplikace.

Když se podíváme na historický vývoj Androidu, vidíme, že původní verze systému byly určeny především pro mobilní telefony s malými obrazovkami. Až s příchodem tabletů, kdy byla potřeba rozdělit obrazovku na více sekcí, byla představena třída Fragment v Androidu 3.0. Tato třída přinesla nejen novou strukturu pro rozdělení obrazovky, ale i životní cyklus fragmentu, který je podobný životnímu cyklu aktivity, s několika specifickými událostmi.

Fragmenty lze považovat za malé "aktivity", které mají vlastní třídu, rozložení a životní cyklus. Místo toho, abyste navrhovali celé uživatelské rozhraní v jedné aktivitě, můžete obrazovku rozdělit na menší, logické sekce a každou z nich převést na fragment. Aktivita pak může odkazovat na jeden nebo více fragmentů, jak to situace vyžaduje. Takové rozdělení nejen že zjednodušuje správu rozhraní, ale umožňuje lepší opětovné využití komponent a flexibilitu při vývoji aplikace.

Životní cyklus fragmentu

Podobně jako u aktivit, i fragmenty mají vlastní životní cyklus. Tento cyklus je založen na několika klíčových událostech, které jsou volány při specifických změnách stavu fragmentu. Zde je stručný přehled těch nejdůležitějších:

  • onAttach(): Volá se, když je fragment připojen k aktivitě.

  • onCreate(): Volá se při prvotním vytvoření fragmentu.

  • onCreateView(): Volá se při vytváření a zobrazení rozložení fragmentu.

  • onActivityCreated(): Volá se, když je aktivita vytvořena.

  • onStart(): Fragment se stává viditelným pro uživatele.

  • onResume(): Fragment se připravuje k zobrazení na obrazovce.

  • onPause(): Fragment je pozastaven a měly by se ukládat veškeré data uživatele.

  • onStop(): Fragment už není viditelný pro uživatele.

  • onDestroyView(): Provádí se čištění fragmentu.

  • onDetach(): Fragment je odpojen od aktivity.

Při tvorbě fragmentu je třeba také pamatovat na to, že existují různé podtřídy fragmentů, které lze využít podle potřeby. Například DialogFragment je určen pro vytváření vyskakovacích dialogů, ListFragment pro zobrazení seznamů v fragmentu, a PreferenceFragment pro vytvoření seznamu preferencí, jak je běžné v nastavení aplikace.

Vytváření a přidávání fragmentů do aplikace

Pokud chcete vytvořit fragment v Android aplikaci, je potřeba definovat třídu fragmentu a přidat ji do layoutu aktivity. Tento proces obvykle zahrnuje vytvoření nového XML souboru pro rozložení fragmentu a následné vytvoření Java třídy, která tento fragment načte.

Příklad:

  1. Vytvořte layout soubor fragment_one.xml s jednoduchým obsahem.

  2. Vytvořte Java třídu FragmentOne, která dědí z třídy Fragment a přetíží metodu onCreateView(), která načte layout fragmentu.

  3. V hlavní aktivitě (MainActivity) přidejte fragment do layoutu pomocí fragmentového kontejneru, například pomocí kódu:

    xml
    <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />

    A v aktivitě přidejte fragment do tohoto kontejneru pomocí FragmentTransaction.

Dynamické přidávání a odebírání fragmentů

Ve výše uvedeném příkladu jsme použili statický fragment, což znamená, že fragment je přidán do rozložení při spuštění aktivity a nelze jej měnit za běhu aplikace. Avšak v reálných aplikacích často potřebujeme přidávat nebo odebírat fragmenty dynamicky, například při přechodech mezi obrazovkami nebo při změně konfigurace zařízení.

Pro tuto funkčnost se používá FragmentManager, který umožňuje přidávat, odebírat a měnit fragmenty během běhu aplikace. Pomocí FragmentTransaction můžeme vykonat několik akcí, jako je přidání fragmentu, nahrazení existujícího fragmentu nebo jeho odstranění.

Příklad dynamického přidání fragmentu:

java
FragmentTransaction transaction = getFragmentManager().beginTransaction();
Fragment fragment = new MyFragment(); transaction.replace(R.id.fragment_container, fragment); transaction.commit();

Důležitost fragmentů v moderních aplikacích

Použití fragmentů přináší několik výhod. Fragmenty umožňují flexibilní a dynamickou změnu uživatelského rozhraní na základě orientace zařízení (například na vertikální orientaci zobrazení pouze jednoho fragmentu, na horizontální orientaci pak více fragmentů vedle sebe). Fragmenty jsou také užitečné v případě, že chcete mít v jedné aktivitě různé sekce, které mohou být nezávislé a opakovaně použitelné.

Je také důležité mít na paměti, že správa fragmentů může být složitá, zejména pokud jde o zachování jejich stavu při změnách konfigurace nebo při navigaci zpět. Fragmenty musí být navrženy tak, aby správně reagovaly na změny životního cyklu a byly schopny správně obnovit svůj stav při obnovení aktivity.

Jak získat orientaci zařízení v Android aplikaci a co важно mít na paměti při práci s konfiguracemi

V rámci vývoje pro Android je jedním z běžných požadavků zjistit aktuální orientaci zařízení. Tento úkol může být důležitý v různých scénářích, od přizpůsobení rozhraní aplikace až po správu kamery a obrazových dat. Android poskytuje několik způsobů, jak získat orientaci zařízení a reagovat na změny konfigurace. V této kapitole se podíváme na to, jak zjistit orientaci zařízení, jak správně pracovat s přechody mezi orientacemi a jak se vyhnout některým běžným chybám při správě orientace a konfigurace.

Pokud se rozhodnete nechat Android automaticky upravit layout při změně orientace zařízení, budete s tímto chováním spokojeni v mnoha případech. Avšak, pokud chcete mít nad tímto procesem větší kontrolu, můžete automatické změny konfigurace vypnout. Pokud například chcete být upozorněni na změnu orientace bez automatického přebudování layoutu a resetování stavu aplikace, musíte v Android manifestu přidat atribut android:configChanges="keyboardHidden|orientation|screenSize" do vaší Activity. Tento atribut znamená, že když dojde k jakékoliv změně konfigurace (například změně orientace, velikosti obrazovky nebo zobrazení klávesnice), systém zavolá metodu onConfigurationChanged(), místo aby automaticky restartoval Activity.

Metoda onConfigurationChanged() vám umožní získat nové konfigurace zařízení, včetně orientace, kterou můžete snadno vyhodnotit pomocí následujícího kódu:

java
int orientation = getResources().getConfiguration().orientation;

Pokud chcete pracovat s orientací přímo, bez jakéhokoliv zásahu systému, můžete provést porovnání s jedním z následujících stavů:

  • Configuration.ORIENTATION_LANDSCAPE pro orientaci na šířku

  • Configuration.ORIENTATION_PORTRAIT pro orientaci na výšku

  • Configuration.ORIENTATION_UNDEFINED pro neznámou orientaci

Přesto, že tento přístup může být užitečný pro mnohé aplikace, je důležité si uvědomit, že zakázání automatických změn konfigurace by nemělo být používáno jako náhrada za správné ukládání stavu aplikace. V případě, že aplikace je přerušena nebo pozastavena, systém ji může ukončit, což povede ke ztrátě dat, pokud nebudete správně ukládat stav pomocí metod jako onSaveInstanceState(). Tento postup by měl být vždy součástí správného návrhu aplikace.

Kromě orientace zařízení, můžete také potřebovat zjistit aktuální rotaci obrazovky, což je zvláště důležité, pokud pracujete s kamerou nebo multimediálním obsahem, jako jsou fotografie a videa. Zde je k dispozici další způsob, jak zjistit rotaci obrazovky:

java
int rotation = getWindowManager().getDefaultDisplay().getRotation();

Hodnota rotace bude jedním z následujících možných stavů:

  • Surface.ROTATION_0 (normální orientace)

  • Surface.ROTATION_90 (otočeno o 90 stupňů)

  • Surface.ROTATION_180 (otočeno o 180 stupňů)

  • Surface.ROTATION_270 (otočeno o 270 stupňů)

Tento způsob je užitečný, pokud chcete pracovat s multimediálním obsahem a potřebujete přizpůsobit orientaci zobrazených obrázků nebo videí v závislosti na aktuální rotaci obrazovky. Například, když je zařízení v režimu na výšku a uživatel pořídí fotografii, která je následně otočena podle orientace, můžete podle této hodnoty upravit zobrazení tak, aby odpovídalo správné orientaci.

Pokud se rozhodnete manipulovat s orientací nebo rotací v rámci vaší aplikace, mějte na paměti, že i přesto, že můžete získat hodnoty pro orientaci a rotaci, není vždy nutné měnit samotné rozhraní aplikace v reakci na každou změnu. Správné použití této informace závisí na konkrétní povaze aplikace a na tom, jakým způsobem interagujete s uživatelem a jeho zařízením.

Při práci s různými konfiguracemi a orientacemi si vždy zapamatujte, že změny konfigurace mohou mít dalekosáhlý dopad na uživatelský zážitek. Když deaktivujete automatické přebudování, aplikace může být rychlejší a snáze udržitelná, ale zároveň musíte zajistit, že všechny potřebné informace, jako jsou data a stav, jsou správně uloženy. Bez řádného ukládání stavu může být aplikace náchylná k nechtěným ztrátám informací, což by mohlo negativně ovlivnit uživatelskou zkušenost.