Фрагмент onActivityResult не вызывается после изменения ориентации

обратите внимание, что этот вопрос не является дубликатом следующего:

кроме того, еще аналогичный вопрос был задан раньше, но это не упоминает об изменениях ориентации (и не решен).

мой 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 в первую очередь.

это ошибка фреймворка? Как это можно обойти?

редактировать: добавлено больше кода из-за популярности требовать.

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

2 ответов


у меня есть одно решение в настоящее время он работает в моем проекте. выполнить шаги.

--> создать имя интерфейса OnActivityResultListener (или имя, как вы хотите).

открытый интерфейс OnActivityResultListener {

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

}

--> сделайте рефренс 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 класса Fragment регистрирует ваш фрагмент в activity для результата Activity. как

@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% в любом направлении.


решил его, переместив все onActivityResult логику Fragment до Activity.

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

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