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

时间:2014-01-23 08:55:38

标签: android android-fragments orientation-changes

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

此外,之前曾询问过另一个similar question,但未提及方向更改(并且尚未解决)。

如果我不切换方向,onActivityResult中的Fragment方法会被调用。但是,如果我按照这些步骤操作,则不会调用它:

  1. 在FragmentActivity中加载片段。
  2. 来自片段:startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), Constants.REQ_CODE_IMAGE_CAPTURE);
  3. 等待相机加载。
  4. 切换方向。
  5. 拍照并点击复选标记。
  6. 仍然在父FragmentActivity中调用

    onActivityResult。但是,由于这个警告,我得到了:

    W/FragmentActivity(4418): Activity result no fragment exists for index: 0x22d73
    

    ...我的猜测是,由于方向更改导致父级被破坏,并且在重新创建之后,无法找到首先调用Fragment的{​​{1}}。

    这是一个框架错误吗?如何解决这个问题?

    编辑:由于受​​欢迎的需求,添加了更多代码。

    FragmentActivity.java:

    startActivityForResult

    ExampleFragment.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);
    }
    

2 个答案:

答案 0 :(得分:1)

我有一个解决方案 它目前正在我的项目中工作。 按照步骤。

- >创建接口名称OnActivityResultListener(或您希望的名称)。

public interface OnActivityResultListener {

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

}

- >在你的FragmentActivity中加入intercace,如

public OnActivityResultListener activityResultListener;

- >现在覆盖FragmentActivity中的OnActivityResult。如下。

@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);
    }

- >现在在Fragment中实现接口并覆盖所需的方法。

@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的活动结果中注册你的Fragment。像

@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%工作。

答案 1 :(得分:1)

通过将所有onActivityResult逻辑从Fragment移至Activity来解决此问题。

请注意,但是传递给reqCode的{​​{1}}与传递给父Fragment的{​​{1}}不同(reqCode的那个由我认为的系统设置)。这意味着我还必须将原来的Activity来电从Activity移至startActivityForResult,然后创建一种方法,以便在需要时从Fragment调用它。 / p>

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