Обратите внимание, этот вопрос не является дубликатом:onActivityResult фрагмента не вызывается после изменения ориентации
- https://stackoverflow.com/questions/19006776/onactivityresult-not-working-with-fragments
- onActivityResult not working on fragments
Кроме того, еще один similar question был задан ранее, но не упоминает изменения ориентации (и не решено).
Метод onActivityResult
в Fragment
действительно вызван, если я не переключаю ориентацию. Однако, если я последую этим шагам, он не будет вызван:
- Загрузить фрагмент в FragmentActivity.
- От фрагмента:
startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), Constants.REQ_CODE_IMAGE_CAPTURE);
- Подождите, пока камера не загрузится.
- Переключение ориентации.
- Сделайте снимок и нажмите галочку.
onActivityResult
по-прежнему вызывается в родительском объекте FragmentActivity. Однако, из-за это предупреждение я получаю:
W/FragmentActivity(4418): Activity result no fragment exists for index: 0x22d73
... мое предположение о том, что родитель разрушается из-за изменения ориентации, и после того, как было создано заново, не может найти Fragment
, призывающие startActivityForResult
в первую очередь.
Является ли это ошибкой в каркасе? Как это можно обойти?
EDIT: Добавлено больше кода из-за популярного спроса.
FragmentActivity.java:
...
fragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace (R.id.mainContentView, fragment);
if (clearBackStack) {
// clear the back stack
while (getSupportFragmentManager().popBackStackImmediate());
// add the current transaction to the back stack
transaction.addToBackStack (null);
}
else {
transaction.addToBackStack(null);
}
transaction.commit();
...
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
}
ExampleFragment.java:
Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePicture, Constants.REQ_CODE_IMAGE_CAPTURE);
...
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch (requestCode) {
case Constants.REQ_CODE_IMAGE_CAPTURE:
// handle added image
}
}
В библиотеке поддержки есть проблема. Проверьте это сообщение: http://shomeser.blogspot.com/2014/01/nested-fragments-for-result.html –
@shomeser, ваше сообщение пришло в поисках чего-то, но у меня нет вложенных фрагментов, поэтому я не Думаю, это связано. – Shade
индекс вашего фрагмента слишком большой: 0x22d73, похоже, что-то странное произошло. эта проблема стабильна для воспроизведения? вы могли бы показать свой код? –