Фрагменты startActivityForResult всегда возвращают resultCode 0 и намерение null при обратном вызове onActivityResult.

Я искал везде, и есть похожие сообщения об этом, но не могу найти решение!

Моя ситуация: у меня есть Activity A, который содержит fragment, и из этого fragment я хочу начать новый Activity B, который должен возвращать некоторые значения в fragment.

На fragment

startActivityForResult(mapIntent, ConstantsUtils.TOMAP_REQUEST_CODE);

На Activity B, чтобы вернуть данные

Intent returnIntent = new Intent();
returnIntent.putExtra(SerializationConstants.isSearchSaved, mAbItemsShown.ordinal());
setResult (ConstantsUtils.SUCCESS_RETURN_CODE, returnIntent);
finish();

На фрагменте

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

switch (requestCode) {

    case ConstantsUtils.TOMAP_REQUEST_CODE:

            if (resultCode == ConstantsUtils.SUCCESS_RETURN_CODE) {
              //do some stuff 
            }
    }
}

onActivityResult из fragment успешно вызывается с правильным requestCode, но resultCode всегда 0, а намерение всегда null.

У меня нет другой реализации onActivityResult под Activity A.

На самом деле, я также пытаюсь начать activity с fragment с getActivity().startActivityForResult(mapIntent, ConstantsUtils.TOMAP_REQUEST_CODE); и реализовать onActivityResult на Activity А, но получается то же самое, правильно requestCode, но неправильно resultCode и intent.

Я использую Sherlock Action Bar, поэтому мой fragment — это SherlockListFragment, поэтому я использую support library (r18).

Можете вы помочь мне? Спасибо


person nirvik    schedule 29.08.2013    source источник
comment
Я не знаю, для чего твой super.onActivityResult(requestCode, resultCode, intent);. Не нужно, на мой взгляд. Кроме того, ваш request_code должен быть ›= 0, как упоминается [здесь][doc][doc]: developer.android.com/reference/android/app/, int)   -  person Owen Zhao    schedule 29.08.2013
comment
super не обязательно, я просто пытался понять, не из-за него ли проблема, но тот же результат, если я его не поставлю. Константа SUCCESS_RETURN_CODE имеет значение 1, но то же самое происходит и с Activity.RESULT_OK.   -  person nirvik    schedule 30.08.2013
comment
Похоже, вы звоните finish() где-то еще в ActivityB. Вызов finish() без установки кода результата и данных результата приведет к именно тому поведению, которое вы описываете. Либо это, либо ActivityB падает, это будет делать то же самое.   -  person David Wasser    schedule 30.08.2013
comment
Тогда я должен посоветовать вам проверить действие А в части onStart() или onResume. Если вы создадите новые экземпляры фрагмента, в котором вы вызвали startActivityForResult, это будет проблемой. Обычно Android автоматически восстанавливает предыдущее состояние, когда вы выполняете действие B, вызывая finish(). Итак, если вы создадите другой экземпляр фрагмента вручную, он заменит того, кто получит возвращенный Intent.   -  person Owen Zhao    schedule 30.08.2013


Ответы (2)


Код результата 0 равен RESULT_CANCELLED.

The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation.

Также частой причиной получения этого кода является запуск активности в новой задаче (проверьте свой интент и манифест на наличие флагов, которые приводят к запуску новой задачи).

Также, если у вас есть родительское действие, вы должны установить его результирующий код вместо установки результирующего кода его дочернего элемента (попробуйте getParent и, если он не равен нулю, установите его результирующий код).

person esentsov    schedule 29.08.2013
comment
Я проверил, и у меня нет специального флага в манифесте или при создании намерения. И значение getParent внутри ActivityB (тот, который выполняет setResult) равно null - person nirvik; 30.08.2013
comment
Потрясающе, спасибо. Проблема для меня заключалась в том, что у меня в манифесте было значение launchMode=singleTask. - person elimirks; 26.09.2013
comment
@elimirks, не могли бы вы объяснить мне, как вы решили свою проблему? Мне нужно иметь launchMode="singleTask", но я все еще хотел бы начать новую деятельность. - person mariosangiorgio; 26.10.2013
comment
@mariosangiorgio режим запуска singleTask предназначен только для автономных действий. - person elimirks; 28.10.2013

Я потратил некоторое время, чтобы выяснить причину. Моя ошибка была помещена super.onBackPressed() в метод onBackPress().

Я вызвал finish() в методе. Но я думаю, что super.onBackPressed() автоматически вызовет finish(), поэтому вы всегда будете получать resultCode 0. Так что просто удалите строку super.onBackPressed() в методе onBackPressed().

person Harri Westman    schedule 19.01.2017
comment
У меня была такая же проблема, и этот комментарий спас меня! благодарю вас :) - person yoonhok; 07.10.2017
comment
Вам не нужно удалять super.onBackPressed(), просто поместите код setResult() перед super.onBackPressed() - person Muhammed Irfan; 14.05.2020