当前位置: 首页 > 知识库问答 >
问题:

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

单于轶
2023-03-14

请注意,此问题不是以下问题的重复:

  • https://stackoverflow.com/questions/19006776/onactivityresult-not-working-with-fragments
  • onActivityResult不处理片段

此外,之前也有人问过类似的问题,但这并没有提到方向的变化(目前尚未解决)。

如果不切换方向,则会调用片段中的onActivityResult方法。然而,如果我遵循这些步骤,它不会被调用:

  1. 在FragmentActivity中加载片段

在父FragmentActivity中仍会调用onActivityResult。然而,由于这个警告,我得到:

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

...我的猜测是,父对象由于方向更改而被破坏,在重新创建后,首先无法找到称为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);
}

例Fragment.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个答案

傅翰池
2023-03-14

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

--

ActivityResultListener的公共接口{

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

}

--

public OnActivityResultListener activityResultListener;

--

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

--

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

-

仲孙鸿畴
2023-03-14

通过将所有onActivityResult逻辑从片段移动到活动来解决它。

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

如果有人找到更优雅的方式,我很乐意听到。

 类似资料:
  • 我有一个活动与行动栏标签。每个选项卡都包含一个片段。现在,当我旋转我的设备时,我的相应片段中的bundle是空的。当我使用Android3.2后的设备时,这是小心的,但当设备是Android3.0时,这是发生的。我在这个问题上工作后感到头痛。我就这样勾选了各种链接,但无济于事。虽然我已经给出了足够的细节,但仍然会提供一些代码段作为在各种情况下用户要求的代码段。 在我的片段类中,我存储了这个值

  • 我有一个活动,它在onCreate中加载一个片段(比如Fragment1)。当用户按下Fragment1中的按钮时,我用一个新片段替换Fragment1,比如Fragment2。问题是,在Fragment2中更改方向时,会重新创建活动,并显示Fragment1而不是Fragment2。(因为我在onCreate中创建了Fragment1)我如何坚持Fragment2并在方向更改时保持其状态? 谢谢

  • 我有一个以编程方式创建片段的活动。该片段内部有另一个片段。 活动包含片段A。片段A包含片段B。 如果(savedInstanceState==null){ } 但对我不起作用! null null 活动: 片段:

  • 我有一个活动,在它的onCreate中向它的布局添加一个片段。 第一次创建该活动并调用oncreates时,片段为空,因此将向R.id.fragment_container添加一个新的MyFra0020。我希望在方向更改后调用onCread时也会出现同样的情况,但在这种情况下,片段确实不是空的。我真的想知道方向改变时会发生什么。

  • 我有一个片段,它添加了一个选项到选项菜单。当单击此选项时,将打开一个对话框片段。对话框将原始片段设置为其目标片段。如果在对话片段打开时没有发生方向变化,则目标片段与预期的一样,但是在方向变化之后,目标片段被设置为对话片段本身,而不是先前设置的片段。结果,当试图将目标片段强制转换为被设置为目标片段的片段时,我得到了一个classCastException。我需要在对话框中获取目标片段,因为它实现了一

  • 我有一个recyclerview有不同的肖像和景观布局。当活动开始时,不管方向如何,recyclerview都会填充数据。但如果改变了方向,则不会显示任何数据。并且没有显示相应的方向变化的数据。