我正在将我的一些项目转换为使用片段。我们如何与片段对话框进行通信?我想创建一个片段对话框,只是为了从用户那里获得一些文本输入。当对话框被解除时,我想将输入的文本传递回“父”片段(启动它的片段)。例如:
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");
}
}
由于
答案 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,则将获得相同的实例。 这带来了新的可能性,也带来了挑战。