2014-01-23 5 views
10

Обратите внимание, этот вопрос не является дубликатом:onActivityResult фрагмента не вызывается после изменения ориентации

Кроме того, еще один similar question был задан ранее, но не упоминает изменения ориентации (и не решено).

Метод onActivityResult в Fragment действительно вызван, если я не переключаю ориентацию. Однако, если я последую этим шагам, он не будет вызван:

  1. Загрузить фрагмент в FragmentActivity.
  2. От фрагмента: startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), Constants.REQ_CODE_IMAGE_CAPTURE);
  3. Подождите, пока камера не загрузится.
  4. Переключение ориентации.
  5. Сделайте снимок и нажмите галочку.

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 
    } 
} 
+0

В библиотеке поддержки есть проблема. Проверьте это сообщение: http://shomeser.blogspot.com/2014/01/nested-fragments-for-result.html –

+0

@shomeser, ваше сообщение пришло в поисках чего-то, но у меня нет вложенных фрагментов, поэтому я не Думаю, это связано. – Shade

+0

индекс вашего фрагмента слишком большой: 0x22d73, похоже, что-то странное произошло. эта проблема стабильна для воспроизведения? вы могли бы показать свой код? –

ответ

1

Разрешено путем перемещения всей логики onActivityResult от Fragment до Activity.

Обратите внимание, однако, что reqCode, который переходит в руки Fragment отличается от reqCode, который доставляется к родителю Activity (один для Activity устанавливается системой, я думаю). Это означало, что мне также пришлось переместить исходный вызов startActivityForResult из Fragment в Activity, а затем создать метод для его вызова из Fragment при необходимости.

Если кто-нибудь найдет более элегантный способ, я буду рад услышать об этом.

+1

См. Метод FragmentActivity.startActivityFromFragment(), он изменяет исходный код запроса для хранения индекса фрагмента: http://goo.gl/yuaPWW Вот почему вы получили другое значение. Грустно, но в настоящее время я не могу воспроизвести эту проблему. –

+0

Это исправление работало для меня. Проблема возникла только на некоторых устройствах (Galaxy S5 был прекрасен, но у меня была ошибка на Sony XPeria) –

+0

В моей ситуации onActivityResult уже был на моем классе Activity. Но я по-прежнему замечаю такое же поведение. –

0

У меня есть одно решение это в настоящее время работает в моем проекте. Следуйте за шагом.

-> Создать имя интерфейса OnActivityResultListener (или имя по своему желанию).

общедоступный интерфейс OnActivityResultListener {

public boolean onActivityResultTest(int request_code, int response_code, 
     Intent data); 

}

-> Сделать refrence из intercace в вашем FragmentActivity как

public OnActivityResultListener activityResultListener; 

-> Теперь переопределить OnActivityResult в FragmentActivity. как показано ниже.

@Override 
public void onActivityResult(int arg0, int arg1, Intent arg2) { 
    AppLog.Log(TAG, "onActivityResult"); 
    try { 
     if (activityResultListener != null) { 
      activityResultListener.onActivityResultTest(arg0,arg1,arg2); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    super.onActivityResult(arg0, arg1, arg2); 
    } 

-> теперь реализует интерфейс в вашем фрагменте и отменяет требуемый метод.

@Override 
public boolean onActivityResultTest(int requestCode, int resultCode, 
     Intent data) { 
    AppLog.Log(TAG, "onActivityResultTest"); 
    if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) { 
     isHavePhoto = true; 
     bitmap = (Bitmap) data.getExtras().get("data"); 
     userEditPhoto.setImageBitmap(bitmap); 
    } 
} 

-> и последний шаг в OnAttach Метод класса фрагмента зарегистрировать фрагмент в деятельности за результат своей деятельности. как

@Override 
    public void onAttach(Activity activity) { 
     this.activity = (YOUR_FRAGMENT_ACTIVITY) activity; 
      this.activity.activityResultListener = this; 
     super.onAttach(activity); 
    } 

-> Теперь тест и не забыл удалить его

@Override 
public void onDestroyView() { 
    activity.activityResultListener = null; 
    super.onDestroyView(); 
} 

-> это то, что некоторые длительный процесс, но он работает на 100% в любой ориентации.

+0

Не работает на Android 4.4, Nexus 5, версия 19.0.1 библиотеки поддержки. Фрагмент присоединяется после вызова «onActivityResult» Activity, поэтому в момент его вызова слушатель имеет значение null. – Shade

+0

извините, но он работает с 4.4 я тестировал в Nexus 4 и 5 тоже работает. вам нужно сказать мне, что я думаю, что у вас есть проблема с onAttach method.check для всего шага снова. –

+0

Ну, это может быть. Однако в моей нынешней ситуации это не работает для меня. – Shade

Смежные вопросы