dnes se podíváme, jak spravovat (udržovat a obnovovat) stav aktivit v Xamarinu.Aplikace pro Android, aby byla aplikace konzistentní a reaktivní pro změny konfigurace/stavu.

obsah

proč zachovat a obnovit stav aktivity?

Jak jsem již popsal v mém příspěvku o Android Aktivit, OS může reagovat na některé „neustálé“ změny stavu voláním metody životního cyklu při Aktivitě života, který může být přepsána programátor, aby se některé další akce. Nicméně, tam jsou některé chování v Android aplikace, která může změnit jeho konfiguraci, po které stát na Činnost (například: uspořádání nebo některé prvky uživatelského ROZHRANÍ nebo políčka‘ výběry) mohou být ztraceny, pokud není správně zacházet.

abych vám dal skutečný příklad: v aplikaci MoneyBack je hlavní obrazovka se dvěma kartami. Všiml jsem si, že když druhý je vybrána karta:

MoneyBack – 2. na kartu vybrané

a přístroj se otáčí:

MoneyBack – 1. tab vybraných po otočení

první záložce nevybere. Uživatel ztrácí svůj vstup (výběr 2. karty).

změna orientace obrazovky je jedním z důvodů, proč bychom se měli starat o ukládání a obnovu stavů aktivit.

Udržování změny – OnSaveInstanceState()

Každá Činnost nám umožňuje přepsat OnSaveInstanceState(Bundle outState) metoda, která je volána, když aktuální Činnost má být zabit (např. když zařízení je orientace obrazovky změna nebo Činnost musí být zabit Android, s cílem uvolnit některé zdroje).

nezaměňujte jej s metodami životního cyklu aktivity (které jsem již popsal zde), jako je OnPause () nebo OnStop (), které jsou vždy volány operačním systémem, když dojde k určité akci. Metoda OnSaveInstanceState() se obecně nazývá po OnPause () a před OnStop (), ale není tomu tak vždy. Například to nebude voláno vůbec, když uživatel přejde zpět z ActivityB do ActivityA, jako v tomto případě ActivityB nikdy nebude zabit. Další podrobnosti naleznete v oficiální dokumentaci pro Android.

OnSaveInstanceState() je volán s parametrem svazku. Představuje jednoduchý slovník klíčových hodnot, který je navíc serializován, takže by měl být použit pro ukládání jednoduchých hodnot, jako jsou řetězce, celá čísla atd. Existují další struktury a techniky pro ukládání složitějších dat o událostech změn stavu (viz odkaz v části „shrnutí“ tohoto příspěvku).

Ve snaze ušetřit vybrané kartě, můžeme implementovat metodu takto:

protected override void OnSaveInstanceState(Bundle outState)

{

var tabSelectedPosition =.Akce.SelectedNavigationIndex;

outState.PutInt („selectedTabPosition“, tabSelectedPosition);

základna.OnSaveInstanceState(outState);

}

zobrazení raw OnSaveInstanceState.cs hostil s ❤ tím, že GitHub

Nyní, každou změnu orientace obrazovky, bude se tato metoda nazývá a index vybrané kartě budou uloženy do Bundle outState slovníku pod „selectedTabPosition“ klíč.

Obnovení stavu změny – OnRestoreInstanceState()

jakmile je Činnost považována za zády na život (je obnovena), OnRestoreInstanceState(Bundle savedInstanceState) metoda se nazývá OS. Vyvolá se pouze v případě, že existuje uložená instance uložená voláním metody OnSaveInstanceState () dříve. Jak vidíte, tato metoda také přichází s parametrem svazku, což je stejný serializovaný slovník klíčové hodnoty, který jsme použili pro uložení stavu aktivity.

V případě obnovení výběru karet můžeme tuto metodu implementovat podle následujícího kódu:

protected override void OnRestoreInstanceState(Bundle savedInstanceState)

{

base.OnRestoreInstanceState(savedInstanceState);

var previouslySelectedTabPosition = savedInstanceState.GetInt(„selectedTabPosition“, 0);

this.ActionBar.SetSelectedNavigationItem(previouslySelectedTabPosition);

}

view raw OnRestoreInstanceState.cs hostil s ❤ tím, že GitHub

previouslySelectedTabPosition proměnné budou inicializovány s celočíselná hodnota od Svazku slovníku uložena pod „selectedTabPosition“ klíč, nebo výchozí hodnotě (0), pokud není nic uloženo pro klíčové je nalézt.

poznámka: parametr svazku uvedený v OnRestoreInstanceState() je přesně stejný jako parametr dostupný v metodě OnCreate (Bundle bundle) nazvané vytvoření aktivity. Vlastně bychom mohli také získat naše uložené hodnoty, ale v mnoha případech obnovení stavu (jako výběr dříve vybraných tab) vyžaduje některé prvky uživatelského ROZHRANÍ musí být již inicializován, které by měly být řešeny v OnCreate() metoda předtím. Z tohoto důvodu bych raději doporučil obnovit stav aktivity pomocí OnRestoreInstanceState() jako obecné pravidlo (samozřejmě se mohou vyskytnout některé výjimečné případy ). Onrestoreinstancestate () bude vždy volán po OnCreate ().

Navíc, pokud bychom chtěli použít Svazek parametr v OnCreate() metoda, musíme zkontrolovat každý čas, pokud svazek není NULL (jako nevíme, zda OnSaveInstanceState() byla volána před).

výsledkem je, že stejná karta jako dříve je vybrána i po otočení zařízení na hlavní aktivitě MoneyBack:

MoneyBack – udržet kartu vybrané při otáčení

„Automatické“ změny stavu zpracována OS Android

Možná jste si všimli ve vašem Android aplikace, že ne každý UI prvek musí být zpracovány „ručně“ po provedení výše uvedených metod, aby zachránil svého státu. Android provádí nějaký druh“ automatického “ ukládání a obnovení stavů základních prvků uživatelského rozhraní.

pravidlem je, že pokud má prvek uživatelského rozhraní (jako TextView nebo tlačítko) nastavený android:id .axml layout file, OS bude automaticky spravovat stavy těchto prvků (např. text zadaný do Edittextu).

například pro takto deklarovaný EditText:

jeho vlastnosti (zejména jeho vlastnost Text) budou automaticky uloženy a obnoveny při změnách orientace obrazovky.

shrnutí

viděli jsme, jak zacházet se změnami stavu aktivit Android způsobenými modifikací konfigurace (např. změna orientace obrazovky, aktivita zabitá operačním systémem, aby se uvolnily některé zdroje atd.) prováděcím OnSaveInstanceState() a OnRestoreInstanceState(), kde jsme přidali a získat klíč-hodnota dat do/ze Svazku na pokračování slovník. Jen musíme pamatovat, že tyto metody nejsou vždy volal (např. při navigaci mezi Činnostmi pomocí tlačítka „zpět“), takže tyto by měly být použity pouze pro určitý druh změny stavu.

také Jsme viděli, že ovládací prvky uživatelského ROZHRANÍ s jejich android:id definované v rozvržení souborů, mají své státy, odolné pro změny konfigurace (automaticky zpracovány pomocí Android OS).

Bundle dictionary je serializován pro lepší výkon a využití paměti, takže by v něm měly být uloženy pouze jednoduché zadané hodnoty (jako řetězce nebo celá čísla). Aby bylo možné ukládat složitější data, Android nabízí různé možnosti správy (např. pomocí OnRetainNonConfigurationInstance).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.