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

497   6  

6 ответов:

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

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

изменения:

startActivityForResult(intent, 1);

To:

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
            }

Comments

    Ничего не найдено.