Неправильный requestCode в 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 etc. со случайным более высоким набором битов. Врачи ничего не говорят. Есть идеи?

6 ответов


вы призываете startActivityForResult() из своего Fragment. Когда вы это делаете,requestCode изменен на Activity, которому принадлежит Fragment.

если вы хотите получить правильный resultCode в вашей деятельности, попробуйте это:

изменения:

startActivityForResult(intent, 1);

в:

getActivity().startActivityForResult(intent, 1);

код запроса не является неправильным. При использовании фрагментов библиотеки поддержки v4 индекс фрагментов кодируется в верхних 16 битах кода запроса, а код запроса-в нижних 16 битах. Индекс фрагмента позже используется для поиска правильного фрагмента для доставки результата.

следовательно, для действий, запущенных объектом фрагмента формы, обработайте 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
            }