Неверный запросКод в 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 всегда равны нулю. Любое решение для нулевых данных?