Неверный запросКод в onActivityResult
Я начинаю новую активность из моего фрагмента с помощью
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
и т.д. 0x20001
случайным 0x20001
битом. Документы ничего не говорят об этом. Есть идеи?
Ответы
Ответ 1
Вы вызываете startActivityForResult()
из своего Fragment
. Когда вы это сделаете, requestCode
изменяется на Activity
, которому принадлежит Fragment
.
Если вы хотите получить правильный resultCode
в своей деятельности, попробуйте это:
Изменить:
startActivityForResult(intent, 1);
To:
getActivity().startActivityForResult(intent, 1);
Ответ 2
Код запроса не является ошибочным. При использовании фрагментов библиотеки поддержки v4 индекс фрагмента кодируется в первые 16 бит кода запроса, а ваш код запроса находится в нижних 16 битах. Впоследствии фрагмент-фрагмент используется для нахождения правильного фрагмента для доставки результата.
Следовательно, для объектов, начинающихся с объекта фрагмента, обработайте onActivityResult requestCode, как показано ниже:
originalRequestCode = changedRequestCode - (indexOfFragment << 16)
6 = 196614 - (3 << 16)
Ответ 3
Легче:
int unmaskedRequestCode = requestCode & 0x0000ffff
Проверьте нижние 16 бит, просто разоблачите его, сделав логический И с верхними 16-битными нулями
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final int unmaskedRequestCode = requestCode & 0x0000ffff
if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
//Do stuff
}
}
Ответ 4
Если вы предоставляете константу, сделайте ее общедоступной, а затем используйте в startActivityResult
Пример:
public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
Ответ 5
Вы также можете определить
super.onActivityResult(requestCode, resultCode, data)
в Activity
(если вы переопределите onActivityResult
)
при этом
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
...
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
и вызовите startActivityForResult(intent, requestCode)
внутри Fragment
Ответ 6
в фрагменте
getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
в основной деятельности:
if (requestCode == PLACE_PICKER_REQUEST) {
if (resultCode == RESULT_OK) {
//what ever you want to do
}
Ответ 7
Я тестирую getActiviry(). StartActivityForresult отлично работает для кода запроса, но есть вторая проблема! Данные Intent всегда равны нулю. Любое решение для нулевых данных?