Fragment和DialogFragment之间的通信

Jos*_*ura 17 android android-fragments android-alertdialog

我正在尝试制作Fragment一个Dialog使用DialogFragmentAPI.

我的对话框只有一个EditText视图,我想将写入的字符串传回给它Fragment.

我能够从中显示对话框Fragment,但是我无法从输入字段中检索字符串回到我的Fragment.

我尝试了两种方法来创建一个对话框:覆盖DialogFragment.onCreateView方法并编写整个对话框的视图并覆盖DialogFragment.onCreateDialog并使用AlertDialog.Builder它来更容易编写按钮行为.

关于将事件传递回对话框主机的对话框的 Android文档是关于主机始终是一个Activity永远不是a Fragment.我试图概括在我的情况下使用它的行为,但我不能.

我尝试使用DialogFragment.onAttach回调以获取Activity参考和使用之间的接口Fragment以及DialogFrament和它工作正常,但我不能检索FragmentActivity使它工作.

有人可以帮忙举个简短的例子吗?

提前致谢

小智 43

你可以使用setTargetFragmentgetTargetFragment方法Fragment.您可以将自己设置Fragment为目标,DialogFragment然后从中检索对它的引用DialogFragment.

  • 它就像一个魅力.非常感谢.只有当我通过`Activity`时才需要`setTargetFragment`的第二个(和可选)参数,不是吗? (3认同)
  • @Sam我认为这些文档更多地讨论了多窗格布局中不同片段之间的直接通信.考虑一个活动,它在横向模式下显示两个片段,但在纵向模式下只显示其中一个片段.如果这两个片段直接相互交互,那么事情会变得很快(因为你必须编写额外的代码来确定这两个片段是否同时显示).在这种情况下,最好通过活动(我们知道无论如何都会存在). (2认同)
  • @Sam另一方面,对于这个特殊问题,听起来原始片段与对话框片段紧密耦合,因此使用`setTargetFragment`和`getTargetFragment`是有意义的. (2认同)

ha1*_*gen 5

你可以使用回调.只需在对话框中实现一个"完成"按钮或类似的东西.

所以在你的dialogfragment做这样的事情:

protected OnDialogClickedListener callback = null;

public interface OnDialogClickedListener {
    public abstract void onDialogClicked(int position);
}

public void setOnDialogClickedListener(OnDialogClickedListener l){
    callback = l;
}

button.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        callback.onDialogClicked(position);
        dismiss();
    }
});
Run Code Online (Sandbox Code Playgroud)

在你的活动中做这样的事情:

final YourFragment f = YourFragment .newInstance(0);
f.show(ft, "YourFragment ");
f.setOnDialogClickedListener(new OnDialogClickedListener() {
    @Override
    public void onDialogClicked(int position) {
        updateText(position);
        f.dismiss();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这正是你不应该这样做的方式.您不尊重片段生命周期.请参阅接受的答案和片段通信的官方文档:http://developer.android.com/training/basics/fragments/communicating.html (2认同)