请注意,此问题与以下内容不重复:
此外,之前曾询问过另一个similar question,但未提及方向更改(并且尚未解决)。
如果我不切换方向,onActivityResult
中的Fragment
方法会被调用。但是,如果我按照这些步骤操作,则不会调用它:
startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), Constants.REQ_CODE_IMAGE_CAPTURE);
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);
}
答案 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>
如果有人找到更优雅的方式,我会很高兴听到它。