【问题标题】:How to receive result from a dialog fragment to a dialog fragment如何从对话片段接收结果到对话片段
【发布时间】:2016-06-21 14:29:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • 又是什么问题?您是否尝试将数据从DialogFragment B 传递到DialogFragment A?你找到的解决方案,有什么问题?

标签: android dialog android-dialogfragment


【解决方案1】:

我建议你看看Bus 或者使用BroadcastReceiver 来做,多个回调可以让你的代码耦合,这对于维护来说很糟糕。

【讨论】:

  • 谢谢。我发布了我的解决方案。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我发布了我的解决方案。
【解决方案3】:

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

这里是代码

DialogTwo as 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2022-01-21
    相关资源
    最近更新 更多