I Dag skal Vi se hvordan du administrerer (beholder Og gjenoppretter) Aktivitetstilstanden I Xamarin.Android-applikasjon for å holde appen konsekvent og reaktiv for konfigurasjon / tilstandsendringer.

Innholdsfortegnelse

hvorfor beholde Og gjenopprette Aktivitetens tilstand?

SOM jeg allerede har beskrevet i innlegget mitt Om Android-Aktiviteter, KAN OPERATIVSYSTEMET reagere på noen «konstante» tilstandsendringer ved å ringe livssyklusmetoder under Aktivitetens liv, som kan overstyres av programmereren for å ta noen ekstra handlinger. Det er imidlertid noen atferd i Android-apper som kan endre konfigurasjonen, hvoretter Tilstanden Til Aktiviteten (for eksempel: arrangement eller NOEN UI-elementer eller avkrysningsboksens valg) kan gå tapt hvis den ikke håndteres riktig.For å gi deg et reelt eksempel: I MoneyBack-programmet er det en hovedskjerm med to faner. Jeg la merke til at når den andre kategorien er valgt:

MoneyBack – 2nd tab valgt

og enheten roteres:

moneyback – 1.fane valgt etter rotering

første fane blir valgt. Brukeren mister sin inngang (valg av 2.fane).

Skjermorienteringsendring er en av grunnene til at vi bør bry oss om å lagre Og gjenopprette Aktivitetstilstander.

Holde tilstandsendringer – OnSaveInstanceState ()

Hver Aktivitet tillater Oss å overstyre OnSaveInstanceState(Bundle outState) metode, som kalles når den Nåværende Aktiviteten skal drepes(f. eks.vennligst ikke forveksle Det Med Aktivitetslivssyklusmetoder (som jeg allerede har beskrevet her), Som OnPause () eller OnStop() som ALLTID kalles AV OPERATIVSYSTEMET når det skjer en bestemt handling. OnSaveInstanceState () – metoden kalles vanligvis Etter OnPause() og før OnStop(), men det er ikke alltid tilfelle. For eksempel vil Det ikke bli kalt i det hele tatt når brukeren navigerer tilbake Fra ActivityB Til ActivityA, som I dette tilfellet ActivityB vil aldri bli drept. Flere detaljer finner du i offisiell android dokumentasjon.

OnSaveInstanceState () kalles Med Bundle parameter gitt. Den representerer en enkel nøkkelverdiordbok, som i tillegg er serialisert, så den skal brukes til å lagre enkle verdier som strenger, heltall etc. Det finnes andre strukturer og teknikker for lagring av mer komplekse data om tilstandsendringer (se lenken i «Sammendrag» – delen av dette innlegget).

for å lagre valgt fane, kan vi implementere metoden som følger:

beskyttet overstyring void OnSaveInstanceState(Bundle outState)

{

var tabselectedposition = dette.ActionBar.Du kan også bruke denne funksjonen.PutInt («selectedTabPosition», tabSelectedPosition); base.OnSaveInstanceState(outState);

}

vis raw OnSaveInstanceState.cs vert med ❤ av GitHub

nå, hver skjerm orientering endring vil gjøre denne metoden kalles og indeksen for valgt fane vil bli lagret I Bundle outState ordbok under» selectedTabPosition » nøkkel.

Gjenopprette tilstandsendringer – OnRestoreInstanceState ()

Så snart Aktiviteten anses backs to life (gjenopptas), OnRestoreInstanceState (Bundle savedInstanceState) metoden kalles AV OS. Det vil bare bli kalt hvis det er en lagret forekomst holdt ved å ringe OnSaveInstanceState () – metoden før. Som du kan se, kommer denne metoden også Med En Bundle parameter, som er den samme nøkkelverdien serialisert ordbok vi brukte for å lagre Aktivitetens tilstand.

ved tabulatorvalg gjenoppretting, kan vi implementere denne metoden som følgende kode presenterer:

protected override void OnRestoreInstanceState(Bundle savedInstanceState)

{

base.OnRestoreInstanceState(savedInstanceState);

var previouslySelectedTabPosition = savedInstanceState.GetInt(«selectedTabPosition», 0);

this.ActionBar.SetSelectedNavigationItem(previouslySelectedTabPosition);

}

view raw OnRestoreInstanceState.cs som er vert med ❤ av GitHub

tidligereselectedtabposition variabel vil bli initialisert med heltallsverdi fra Bundle ordbok lagret under» selectedTabPosition » nøkkel, eller standardverdi (0) hvis ingenting lagret for nøkkelen er funnet.

Merk: Bundle parameter gitt I OnRestoreInstanceState() er nøyaktig den samme, som den som er tilgjengelig I OnCreate(Bundle bundle) metode kalt På Aktivitetens opprettelse. Vi kunne faktisk også hente vår lagrede verdi der, men i mange tilfeller gjenoppretter staten (som å velge tidligere valgt fane) krever at NOEN UI-elementer allerede er initialisert, som skal håndteres innen OnCreate () – metoden før. Derfor vil jeg heller foreslå å gjenopprette Aktivitetstilstanden ved å bruke onrestoreinstancestate() som en generell regel (det kan selvfølgelig være noen eksepsjonelle tilfeller 😉 ). OnRestoreInstanceState () vil alltid bli kalt Etter OnCreate ().Videre, Hvis Vi ønsket Å bruke Bundle parameter I OnCreate () metode, må vi sjekke hver gang hvis bundle IKKE ER NULL (som Vi ikke vet om OnSaveInstanceState () hadde blitt kalt før).

som et resultat er den samme kategorien som tidligere valgt selv etter å ha rotert enheten På Moneybacks Hovedaktivitet:

MoneyBack – keeping tab valgt når du roterer

«Automatiske» tilstandsendringer håndtert Av Android OS

Kanskje du la merke til I Android-applikasjonen din, at ikke alle UI-elementer må håndteres «manuelt» ved å implementere de ovennevnte metodene for å lagre tilstanden. Android utfører en slags «automatisk» lagring og restaurering av grunnleggende UI-elementer.regelen her er at SÅ lenge UI-elementet (Som TextView eller Button) har sin android: id satt inn .axml layout fil, OS vil automatisk administrere disse elementene ‘ tilstander (f.eks tekst inngått EditText).

For Eksempel, For EditText erklært slik:

dens egenskaper (spesielt Dens Tekst egenskap) vil automatisk bli lagret og gjenopprettet på skjermen orientering endringer.

Sammendrag

Vi har sett hvordan man håndterer Android-Aktiviteters tilstandsendringer forårsaket av konfigurasjonsendring(f. eks.) ved å implementere OnSaveInstanceState () og OnRestoreInstanceState(), hvor vi la til og hentet nøkkelverdidata til/Fra Bundle serialized dictionary. Vi trenger bare å huske at disse metodene ikke alltid kalles (f. eks. når du navigerer Mellom Aktiviteter ved hjelp av» tilbake » – knappen), så disse bør bare brukes til visse typer tilstandsendringer.Vi har også sett AT UI-kontroller med deres android: id definert i layoutfiler har deres tilstander resistente for konfigurasjonsendringer (håndteres automatisk Av Android OS).Bundle dictionary er serialisert for bedre ytelse og minneutnyttelse, så bare enkle typede verdier skal lagres i den (som strenger eller heltall). For å lagre mer komplekse data, Gir Android ulike muligheter for å håndtere det (f.eks Bruke OnRetainNonConfigurationInstance).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.