Неправильный код запроса в 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
            }
Другие вопросы по тегам