如何从DialogFragment获取数据到Fragment并在娱乐活动中生存

时间:2016-07-13 13:32:55

标签: android android-fragments communication

我的应用程序有这个链:创建片段的活动。在这个片段中有一个单击按钮,调用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传递数据。

1 个答案:

答案 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。像你这样的问题很多都有正确的答案。