如何从对话框片段接收对话框片段的结果

时间:2016-06-21 14:29:31

标签: android dialog android-dialogfragment

我有一个对话框A,用于许多活动。我创建了新的对话框B,并实现了一个接口来接收来自A的调用。在这两种情况下我使用了对话框片段。对于许多活动,我可以使用

管理来自A的回调
if (getActivity() instanceof MyActivity) 
((MyActivity) getActivity()).manageSelectedItem();

但是如果对话框A托管在另一个对话框B中,那么如何管理回调。

我在this上搜索并找到了基于Activity / FragmentActivity / Fragment的解决方案,但无法解决DialogFragment上的问题。

3 个答案:

答案 0 :(得分:1)

我建议您查看Bus或使用BroadcastReceiver来执行此操作,多次回调可以让您的代码耦合,这对于维护而言非常糟糕。

答案 1 :(得分:1)

你可以找到答案heare。或者你可以锁定片段beerwin活动。

getSuportFragmentManager().findFragmentByTag(TAG_FRAGMENT_A).callback();

答案 2 :(得分:1)

我已经解决了这个问题。我刚刚在对话框B中实现了一个界面。在对话框A中的onCreate方法中检查和初始化界面是否托管对话框是活动/对话框。

这是代码

Dialog DialogTwo为A:

public class DialogTwo extends DialogFragment {


@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        if(!(getActivity() instanceof SelectedItemListener)) {
            callback = (SelectedItemListener) getTargetFragment();
        }
    } catch (Exception e) {
        throw new ClassCastException("Calling Fragment must implement SelectedItemListener");
    }

}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.AlertDialogCustom));

    builder.setTitle(R.string.select_color)
            .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    if (getActivity() instanceof SelectedItemListener) {
                            ((NewExerciseActivity) getActivity()).manageSelectedItem();
                    }else {
                        callback.manageSelectedItem();
                    }
                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            });

    return builder.create();
   }
}

来自对话B的电话:

 private void showDialog() {
    FragmentActivity activity = (FragmentActivity) getActivity();
    FragmentManager fm = activity.getSupportFragmentManager();
    DialogTwo dialogTwo = new DialogTwo();
    dialogTwo.setTargetFragment(this,0);
    dialogTwo.show(fm, "dialogTwo");
}

@Override
public void manageSelectedItem() {
       //do something
}