请注意,此问题不是以下问题的重复:
此外,之前也有人问过类似的问题,但这并没有提到方向的变化(目前尚未解决)。
如果不切换方向,则会调用片段中的onActivityResult方法。然而,如果我遵循这些步骤,它不会被调用:
在父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
}
}
我有一个解决方案,它目前正在我的项目中工作。遵循步骤。
--
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();
}
-
通过将所有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都会填充数据。但如果改变了方向,则不会显示任何数据。并且没有显示相应的方向变化的数据。