Неверный код запроса в 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);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