Я начинаю новую активность из моего фрагмента с
startActivityForResult(intent, 1);
и хотите обработать результат в родительской активности фрагмента:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
if (requestCode == 1) {
// bla bla bla
}
}
Проблема в том, что я так и не получил сообщение, на которое requestCode
только что отправил startActivityForResult()
.
Я получил что-то подобное 0x40001
и 0x20001
т. Д. С установленным случайным старшим битом. Документы ничего не говорят об этом. Любые идеи?
android
android-fragments
onactivityresult
Dimanoid
источник
источник
Ответы:
Ты звонишь
startActivityForResult()
со своегоFragment
. Когда вы делаете это, тоrequestCode
изменяетсяActivity
владельцемFragment
.Если вы хотите получить правильные результаты
resultCode
в своей деятельности, попробуйте это:Изменить:
Для того, чтобы:
источник
startActivityForResult
фрагмент и ожидаете результат отonActivityResult
этого фрагмента, просто убедитесь, что вы вызываетеsuper.onActivityResult
действие хоста (если вы переопределяете этот метод там). Это потому, что активность,onActivityResult
кажется, вызывает фрагментonActivityResult
. Также обратите внимание, что код запроса, когда он проходит через действиеonActivityResult
, изменяется, как объяснено в ссылке, которую Диманоид разместил в своем ответе ниже. Возможно, вам не нужно это знать, но вы никогда не узнаете ...Код запроса не неправильный. При использовании фрагментов библиотеки поддержки v4 индекс фрагмента кодируется в верхних 16 битах кода запроса, а код запроса - в нижних 16 битах. Позднее индекс фрагмента используется для поиска правильного фрагмента для доставки результата.
Следовательно, для Деятельности запущен объект фрагмента формы, обработайте onActivityResult requestCode, как показано ниже:
источник
Полегче:
Java :
int unmaskedRequestCode = requestCode & 0x0000ffff
Котлин :
val unmaskedRequestCode = requestCode and 0x0000ffff
Проверьте младшие 16 бит, просто снимите маску, выполнив логическое И с обнуленными старшими 16 битами
источник
Если вы предоставляете постоянный, сделайте его публичным, а затем используйте в
startActivityResult
пример:
источник
Вы также можете определить
super.onActivityResult(requestCode, resultCode, data)
в
Activity
(если вы переопределитьonActivityResult
) в этоми позвоните
startActivityForResult(intent, requestCode)
в свойFragment
источник
во фрагменте
в основной деятельности:
источник