从片段对话框中获取数据 - 最佳实践?

时间:2012-03-19 18:52:26

标签: android

我正在将我的一些项目转换为使用片段。我们如何与片段对话框进行通信?我想创建一个片段对话框,只是为了从用户那里获得一些文本输入。当对话框被解除时,我想将输入的文本传递回“父”片段(启动它的片段)。例如:

public class MyFragment extends Fragment {

    public void onBtnClick() {
        // What's a good way to get data back from this dialog 
        // once it's dismissed?
        DialogFragment dlgFrag = MyFragmentDialog.newInstance();
        dlgFrag.show(getFragmentManager(), "dialog"); 
    }
}

由于

4 个答案:

答案 0 :(得分:30)

正如eternalmatt所说,给定的解决方案并没有真正回答这个问题。与片段通信对话的方式是调用:

dialog.setTargetFragment(myCallingFragment, requestCode);

我这样做的方法是使用静态方法创建FragmentDialog,其中监听器是实例化的,然后执行setFragmentTarget()内容:

public mySuperFragmentDialog extends DialogFragment {
  public interface SuperListener{
     void onSomethingHappened();
  }

  public static mySuperFragmentDialog newInstance(SuperListener listener){
     MySuperFagmentDialog f = new MySuperFragmentDialog();
     f.setTargetFragment((Fragment) listener, /*requestCode*/ 1234);
     return f;
  }
}

从片段创建对话框就像往常一样:

Dialog dialog = MySuperFragmentDialog.newInstance(parentFragment);
dialog.show();

然后当你想与调用对话框的片段通信时:

Fragment parentFragment = getTargetFragment();
((SuperListener) parentFragment).onSomethingHappened();

此解决方案仅适用于从片段而非活动创建对话框的情况,但您可以将两种方法('setFragmentTarget()''onAttach()'一种)加上一些类检查提供完整的解决方案。

答案 1 :(得分:14)

传递此类事件的好方法是使用Android开发人员指南中描述的回调界面

你的Fragment定义了一个像

这样的回调接口
public class MyFragment extends Fragment {
    ...
    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(Uri articleUri);
    }
    ...
}

然后,如果父实现了Callback接口并保存实例,则检查onAttach方法内部。

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnArticleSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
    }
}

当片段中的事件发生时,您只需调用回调处理程序

mListener.onArticleSelected(...);

希望有帮助,进一步信息here

答案 2 :(得分:0)

我曾经遇到过这个问题,在我解决之后,我创建了一个项目,提醒我如何做到这一点。我把项目放在github上,这样任何人都可以看到解决方案。这是链接:https://github.com/mumasaba/FragmentFragmentBoss

在这个项目中,我们有一个简单的应用程序,TextView显示“Hello World”字样。此文本视图位于由主应用活动托管的片段上。此片段需要显示用户在单击添加选项菜单图标后可以输入的新单词。单击时,选项菜单项会调出一个对话框,允许用户键入新单词。用户完成后,可以单击“确定”关闭对话框并在片段的文本视图中显示新输入。因此,说明了Fragment to DialogFragment通信。

答案 3 :(得分:0)

有一种新的模式可能是在片段之间共享ViewModel实例。在将ViewModelFactory实例化到何处获取ViewModel时,必须将上下文指定为参数。如果两个片段的上下文相同(即父活动或父片段),并且您从两个片段实例化了相同的ViewModel,则将获得相同的实例。 这带来了新的可能性,也带来了挑战。