我的应用程序有这个链:创建片段的活动。在这个片段中有一个单击按钮,调用DialogFragment。 DialogFragment允许用户选择相机或从设备存储器中选择图像。
比DialogFragment调用在新活动中将图像发送到裁剪的intent。最终通过onActivityResult将最终路径发送回DialogFragment。
生成的路径应该传递给片段,我使用接口通过活动来执行此操作,如此lesson
此解决方案正常工作,直到用户不更改设备的方向。
当设备在DialogFragment阶段或裁剪活动阶段上旋转时,将重新创建第一个活动并重新创建fragemnt,并销毁DialogFragment的实例。所以我的回调没有运行,也没有任何反应。让我告诉你代码:
SettingUnitActivity
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
addNewUnitFragment = new AddNewUnitFragment();
fragmentTransaction.replace(R.id.single_unit_fragment_container,addNewUnitFragment,"myff");
fragmentTransaction.commit();
//My callback
@Override
public void call(String string) {
AddNewUnitFragment addNewUnitFragment = (AddNewUnitFragment)
getFragmentManager().findFragmentById(R.id.single_unit_fragment_container);
if(addNewUnitFragment != null) {
addNewUnitFragment.changeFragImage(string);
} else {
}
}
AddNewUnitFragment
public void onClick(View v) {
switch (v.getTag().toString()) {
case "add_image":
DialogImageSelect imageSelDialog = DialogImageSelect.newInstance(0);
imageSelDialog.show(getFragmentManager(),"imageSelDialog");
break;
...
//Function which should be called from SettingUnitActivity
public void changeFragImage (String string) {
//Do something with string
}
DialogImageSelect
public static interface dateCallBack {
public abstract void call(String string);
}
static DialogImageSelect newInstance(int id) {
DialogImageSelect di = new DialogImageSelect();
Bundle args = new Bundle();
args.putInt("id", id);
di.setArguments(args);
return di;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callerActivity = (dateCallBack)activity;
}
//Here we take and send image path from croper activity
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != Activity.RESULT_CANCELED) {
if(requestCode == FROM_CROPPER) {
if(data != null) {
croppedFilePath = data.getStringExtra("filePath");
System.out.println("CALL "+callerActivity);
this.callerActivity.call(croppedFilePath);
dismiss();
}
}
}
}
如何在设备旋转时将数据发送到片段以保留它?
UPD:this主题部分揭示了我的问题的答案,但如果在旋转后重新创建活动,则无法解释如何使用DialogFragment中的界面回调通过Activity to Fragment传递数据。
答案 0 :(得分:0)
基本上你需要在onSaveInstanceState()
方法中保存片段上的实例状态。然后在Base Activity的onCreate()
方法中使用此保留状态。
请参阅:
Once for all, how to correctly save instance state of Fragments in back stack?
和
http://emuneee.com/blog/2013/01/07/saving-fragment-states/
您可以在此处进行更多搜索并搜索stackoverflow。像你这样的问题很多都有正确的答案。