Неправильный код запроса в 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
и т.д. с установленным случайным старшим битом. Документы ничего не говорят об этом. Есть идеи?
6 ответов
Ты звонишь startActivityForResult()
от твоего Fragment
, Когда вы делаете это, requestCode
изменен Activity
который владеет Fragment
,
Если вы хотите получить правильный resultCode
в своей деятельности попробуйте это:
Изменить:
startActivityForResult(intent, 1);
Для того, чтобы:
getActivity().startActivityForResult(intent, 1);
Код запроса не неправильный. При использовании фрагментов библиотеки поддержки v4 индекс фрагмента кодируется в верхних 16 битах кода запроса, а код запроса - в нижних 16 битах. Индекс фрагмента позже используется для поиска правильного фрагмента для доставки результата.
Следовательно, для Activity запущен объект фрагмента формы, обработайте onActivityResult requestCode, как показано ниже:
originalRequestCode = changedRequestCode - (indexOfFragment << 16)
6 = 196614 - (3 << 16)
Полегче:
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
}
}
Если вы предоставляете постоянный, сделайте его публичным, а затем используйте в startActivityResult
пример:
public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
Вы также можете определить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
Во фрагменте
getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
в основной деятельности:
if (requestCode == PLACE_PICKER_REQUEST) {
if (resultCode == RESULT_OK) {
//what ever you want to do
}