Неправильный 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
}