片段的onActivityResult在方向更改后未调用

Sha*_*ade 10 android orientation-changes android-fragments

请注意,此问题与以下内容不重复:

此外,之前曾提出过另一个类似的问题,但是没有提到方向变化(并且没有得到解决).

如果我不切换方向,我的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
Run Code Online (Sandbox Code Playgroud)

...我的猜测是由于方向改变导致父母被摧毁,并且在重新创建之后,无法找到首先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);
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Sha*_*ade 2

通过将所有onActivityResult逻辑从 移动Fragment到 来解决它Activity

但请注意reqCode传递给 的 与传递给父级Fragment的 不同(我认为 的 是由系统设置的)。这意味着我还必须将原始调用从移动到,然后创建一个方法以在需要时从 调用它。reqCodeActivityActivitystartActivityForResultFragmentActivityFragment

如果有人找到更优雅的方式,我会很高兴听到。