a startActivityForResult fragmentum és tevékenység viselkedésének megértése
a teljes startActivityForResult és onActivityResult engedélyezett egy 2-utas kommunikáció a forrás tevékenység és a cél tevékenység. Áramlása az alábbi ábrán látható.
az alábbi áramlásból könnyen megérthetjük az Onactivityr eredmény áramlását a forrás tevékenységtől a rendeltetési tevékenységig
a forrás tevékenység hívás, startActivityForResult küldésével a szándék együtt a kérelmet kódot Android SDK.
az Android SDK ezután megnyitja a tevékenységet a szándék szerint.
miután a céltevékenység befejezte a feladatát, visszatér a hívó tevékenységéhez.
a setresult használatával visszaküldheti az eredményt, ha elküldi az eredménykódot és a szándékot
itt több megjegyzés található:
az eredménykódot a céltevékenység használja, hogy megjelölje a forrástevékenységének, hogy mi az állapota (pl. OK, Cancel, stb.).
a kéréskódot a forrástevékenység használja, hogy megtudja, melyik céltevékenység küldi vissza a hívást.
láthattuk, hogy a céltevékenység nem látja a kérés kódját.
nem dokumentált startActivityForResult fragmentum Flow
a fragmentumban startactivityforesult függvényt is hívhatunk, valamint onactivityresult funkciót is felülbírálhatunk.
ez számos kérdést vet fel…pl. hogyan működik? Ugyanaz-e, mint a tevékenységindításaeredmény és az onactivityeredmény? Hogyan kapcsolódnak egymáshoz?
a rövid válasz az, hogy hasonlóak, de finoman különböznek. Gyakori oka a zavartság, és a hiba. Fontos megérteni a hasonlóságokat és a különbségeket.
a fragmentum áramlás illusztrált.
az alábbi ábra világosan szemlélteti, hogyan működik együtt. Az activity startActivityForResult és az onActivityResult flow közötti különbségek piros színűek.
nézzük részletesebben.
amikor fragmentum startActivityForResult (megjegyzés: nem tevékenység?.startActivityForResult), a céltevékenység létrehozása ugyanaz. A különbség azonban az onaktivitáseredményt.
startActivityForResult()
kell kezelni a fragment
onActivityForResult()
getActivity().startActivityForResult()
kell kezelni azt a activity
‘ s onActivityForResult()
ha a fragment
és szeretné kezelni az eredményt a fragment
, használja onActivityForResult()
, különben, ha szeretné kezelni azt a activity
a töredék, használja getActivity.startActivityForResult()
amikor Android SDK visszatér onActivityResult, a kérelem kód megváltozott. A 0xP0000 csatolva van az eredeti requestCode-hoz.
a P-érték 1-től kezdődik, és minden egyes onActivityResult esetében növekszik ugyanabból a célfragmensből. (Ha egy másik célfragmenst hívunk meg, a P-érték visszaáll).
pl. ha az eredeti kérőkód 0xFF (azaz 255), akkor az első alkalommal visszaadott kérőkód 0x100FF lesz. A második alkalommal visszatérési requestCode lesz 0x200FF.
miután visszatért a forrás tevékenység onActivityResult, várható, hogy meg kell hívni super.onActivityResult, amely a FragmentActivity-ben található (az AppCompatActivity szülője)
a FragmentActivity-ben lévő onActivityResult ezután kibontja a P értéket (a >> 16 kérőkód használatával). A P annak a tömbnek az indexe, ahol a forrásfragmenst tárolják. (pl. ha a kérőkód 0x200ff, akkor 0x200ff >> 16 = 2)
a P-érték használatával most hozzáférhet a forrásrészlethez, amelyet az alábbi 9.lépésben használunk.
most eltávolítja a P értéket a requestCode-ból (a requestCode & 0xffff használatával), hogy visszatérjen az eredeti kérési kódhoz (pl. ha a requestCode 0x200ff, akkor 0x200ff & 0xffff = 0xFF)
mivel most megkapja az eredeti kéréskódot, amelyet a forrásfragmens létrehozott, meghívhatja a forrásfragmens onactivityresultját az eredeti kéréskóddal.
néhány alapvető pontot, amelyek szeretnék tudni.
A. Az Activity startActivityForResult viselkedése eltér a fragmentum startactivityforesult
– jétől a fragmentumban, ha activity?.startActivityForResult(...)
– nek hívjuk, akkor a fragmentum onActivityResult
– je nem lesz automatikusan meghívva.
B. Ha felülírjuk az activity onActivityResult eredményét, győződjünk meg róla, hogy van super.onActivityResult helyett
ha felülírjuk forrás tevékenység onActivityResult
, de elfelejti, hogy super.onActivityResult
, akkor töredék onActivityResult
nem lesz meghívva.
C. a requestCode látható activity onActivityResult eltér az egy töredék biztosított
miatt az OK, Android SDK csatolt P
a requestCode
, a tevékenység onActivityResult
, soha nem fogunk azonos requestCode
ott. Ez időnként zavart okoz a fejlesztőnek a kód hibakeresésekor.
D. Amikor egy tevékenység helyreáll az államból (azaz onStateInstance != null), meg kell kerülni újra a fragmentum.
a onActivityResult
meghívásakor megpróbálta letölteni az eredeti töredéket. Ez is végre a tevékenység, amely visszaállítja a megölt állapotban (például emulált használatával ne tartsa tevékenység).
tehát, ha a fejlesztő újra létrehozza a töredéket minden alkalommal, amikor az onCreate-t hívják (függetlenül attól, hogy visszaállított állapot-e vagy sem), akkor a visszaállított eredeti töredék megsemmisül, és a hívó fél onActivityResult
– je, a töredék titokzatosan nem hívható meg.
ez egy buktató még sok tapasztalt fejlesztők és app megjelent a területen, mivel nagyon nehéz egy azonosított hiba (mivel ez nem történik meg minden alkalommal, és szükség van egy bonyolultabb flow kiváltó).
Köszönöm, hogy elolvastad …