Rozpoczynam nową aktywność od mojego fragmentu za pomocą
startActivityForResult(intent, 1);
i chcę obsłużyć wynik w nadrzędnej aktywności Fragmentu:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
if (requestCode == 1) {
// bla bla bla
}
}
Problem polega na tym, że nigdy nie dostałem tego requestCode
, co właśnie wysłałem startActivityForResult()
.
Mam coś podobnego 0x40001
, 0x20001
itd o losowej wyżej ustawionym bitem. Dokumenty nic o tym nie mówią. Jakieś pomysły?
android
android-fragments
onactivityresult
Dimanoid
źródło
źródło
Odpowiedzi:
Dzwonisz
startActivityForResult()
ze swojegoFragment
. Gdy to zrobisz,requestCode
zostanie zmieniony przezActivity
właścicielaFragment
.Jeśli chcesz uzyskać prawidłową
resultCode
aktywność, spróbuj:Zmiana:
Do:
źródło
startActivityForResult
fragmentu i oczekujesz wyniku zonActivityResult
tego fragmentu, po prostu upewnij się, że wywołujeszsuper.onActivityResult
działanie hosta (na wypadek, gdybyś tam zastąpił tę metodę). Wynika to z tego, że aktywnośćonActivityResult
wywołuje fragmentonActivityResult
. Zauważ też, że kod żądania, gdy przechodzi przez działanieonActivityResult
, jest zmieniany, jak wyjaśniono w linku, który Dimanoid opublikował w swojej odpowiedzi poniżej. Być może nie musisz tego wiedzieć, ale nigdy nie wiesz ...Kod żądania nie jest zły. Podczas korzystania z fragmentów biblioteki obsługi v4, indeks fragmentów jest kodowany w 16 górnych bitach kodu żądania, a kod żądania w dolnych 16 bitach. Indeks fragmentów jest później wykorzystywany do znalezienia odpowiedniego fragmentu, aby dostarczyć wynik.
Stąd dla działań rozpoczętych z fragmentu obiektu, obsłuż onCode onActivityResult requestCode jak poniżej:
źródło
Łatwiej:
Java :
int unmaskedRequestCode = requestCode & 0x0000ffff
Kotlin :
val unmaskedRequestCode = requestCode and 0x0000ffff
Sprawdź dolne 16 bitów, po prostu zdemaskuj to logicznie ORAZ z górnymi 16 bitami wyzerowanymi
źródło
Jeśli zapewniasz stałą, upublicznij ją, a następnie użyj w
startActivityResult
przykład:
źródło
Możesz także zdefiniować
super.onActivityResult(requestCode, resultCode, data)
w
Activity
(jeśli przesłoniszonActivityResult
)i zadzwoń
startActivityForResult(intent, requestCode)
do twojegoFragment
źródło
we fragmencie
w głównej działalności:
źródło