forstå opførslen af startActivityForResult for Fragment og aktivitet
hele startActivityForResult og onActivityResult er tilladt en 2-vejs kommunikation mellem kildeaktiviteten og destinationsaktiviteten. Dens strømning er som vist i diagrammet nedenfor.
fra nedenstående strømning kan vi let forstå strømmen af Onactivityresultat fra Kildeaktivitet til Destinationsaktivitet
kilden aktivitet opkald, startActivityForResult ved at sende i hensigten sammen med anmodningen kode til Android SDK.
Android SDK åbner derefter aktiviteten i overensstemmelse hermed som angivet i hensigten.
når destinationsaktiviteten er afsluttet med sit job, vender den tilbage til sin opkaldsaktivitet.
det kunne sende resultatet tilbage ved hjælp af setresultat ved at sende resultatkode og hensigt
flere noter her:
resultatkoden bruges af destinationsaktiviteten til at markere til sin kildeaktivitet, hvad det er status (f.eks.
anmodningskoden bruges af kildeaktiviteten til at vide, hvilken destinationsaktivitet der returnerer opkaldet.
vi kunne se, at destinationsaktiviteten ikke har nogen synlighed af anmodningskoden.
udokumenteret startActivityForResult Fragmentstrøm
i Fragment har vi også startActivityForResult-funktion at ringe til, og også onActivityResult-funktion at tilsidesætte.
dette rejser flere spørgsmål … f. eks. hvordan fungerer det? Er det det samme som aktivitetens startaktivitet for resultat og onactivityresultat? Hvordan er de relateret?
det korte svar er, de er ens, men subtilt forskellige. En hyppig årsag til forvirring og fejl. Så det er vigtigt at forstå ligheden og forskellene.
fragmentstrømmen illustreret.
nedenfor er diagrammet, der tydeligt illustrerer, hvordan det hele fungerer sammen. Forskellene med aktivitetens startActivityForResult og onactivityresultatstrøm er farvet i rødt.
lad os mere uddybe det.
når vi kalder fragmentets startActivityForResult(bemærk: ikke aktivitet ?.startActivityForResult) er oprettelsen af destinationsaktivitet den samme. Forskellen er dog onactivityresultatet.
startActivityForResult()
skal håndtere det fra fragment
‘ s onActivityForResult()
getActivity().startActivityForResult()
skal håndtere det fra activity
‘s onActivityForResult()
hvis du er på en fragment
og du vil håndtere resultatet på fragment
, skal du bruge onActivityForResult()
, ellers, hvis du vil håndtere det fra activity
af fragmentet, skal du bruge getActivity.startActivityForResult()
når Android SDK vender tilbage tilactivityresultat, anmodningskoden er blevet ændret. En 0p0000 er vedlagt den oprindelige anmodningskode.
p-værdien starter fra 1 og øges for hvert onactivityresultat kaldes fra det samme destinationsfragment. (Hvis et andet destinationsfragment kaldes, nulstilles P-værdien).
f.eks. Hvis den oprindelige anmodningskode er 0 gange (dvs. 255), vil anmodningskoden returnere første gang være 0 gange 100. Anden gang returanmodningskode vil være 0h200ff.
når du vender tilbage til kildeaktivitetens onactivityresultat, forventes det, at det skal ringe til super.onactivityresultat, som ligger i FragmentActivity (forælder til AppCompatActivity)
onactivityresultatet i FragmentActivity udtrækker derefter P-værdien (ved hjælp af anmodningskode >> 16). P er indekset for arrayet, hvor kildefragmentet er gemt. (f. eks. hvis anmodningskode er 0h200ff, så 0h200ff >> 16 = 2)
ved hjælp af P-værdien har den nu adgang til kildefragmentet, som bruges i trin 9 nedenfor.
nu fjerner den p-værdien fra anmodningskoden (ved hjælp af anmodningskode & 0) for at komme tilbage til den oprindelige anmodningskode (f. eks. hvis anmodningskode er 0h200ff, så 0h200ff & 0hffff = 0hff)
da det nu får den oprindelige anmodningskode, som kildefragmentet oprettede, kunne det kalde kildefragmentets onactivityresultat med den oprindelige anmodningskode.
nogle grundlæggende punkter, som ønsker at vide.
A. opførslen af aktivitetens startActivityForResult er forskellig fra fragmentets startActivityForResult
i Fragment, hvis vi kalder activity?.startActivityForResult(...)
, kaldes fragmentets onActivityResult
ikke automatisk.
B. Hvis vi tilsidesætter activity ‘ s onactivityresultat, skal du sørge for, at vi har super.onactivityresultat på plads
hvis vi tilsidesætter kildeaktivitetens onActivityResult
, men glemmer at have super.onActivityResult
så bliver fragmentets onActivityResult
ikke kaldt.
C. anmodningskoden, der ses i activity ‘ s onactivityresultat, er forskellig fra det ene fragment, der er angivet
på grund af grunden, Android SDK Tilføjet P
til requestCode
, i aktivitetens onActivityResult
, får vi aldrig det samme requestCode
der. Dette medfører til tider forvirring for udvikleren, når der debugges koden der.
D. Når en aktivitet gendannes fra staten (dvs. onStateInstance != null), bør det undgå genskabe sit fragment.
når onActivityResult
kaldes, forsøgte den at hente det originale fragment. Dette udføres også for den aktivitet, der gendannes fra en dræbt tilstand (f.eks.
så hvis udvikleren genskaber fragmentet hver gangoprettelse kaldes (uanset om det er en restaureret tilstand eller ej), så vil det oprindelige Fragment, der blev genoprettet, blive ødelagt, og onActivityResult
af opkalderen, vil fragmentet mystisk ikke blive kaldt.
dette er en faldgrube selv for mange erfarne udviklere og app udgivet i marken, da det er meget svært at en identificeret fejl (da det ikke sker hver gang, og kræver en mere kompleks strøm til at udløse).
tak for læsning …