有一种更简单的方法可以从 DialogFragment 接收结果。
首先,在你的Activity、Fragment或FragmentActivity中你需要添加以下信息:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// Stuff to do, dependent on requestCode and resultCode
if(requestCode == 1) { // 1 is an arbitrary number, can be any int
// This is the return result of your DialogFragment
if(resultCode == 1) { // 1 is an arbitrary number, can be any int
// Now do what you need to do after the dialog dismisses.
}
}
}
requestCode 基本上是您调用的 DialogFragment 的 int 标签,稍后我将展示它是如何工作的。 resultCode 是您从 DialogFragment 发回的代码,告诉您当前等待的 Activity、Fragment 或 FragmentActivity 发生了什么。
接下来要执行的代码是对 DialogFragment 的调用。一个例子在这里:
DialogFragment dialogFrag = new MyDialogFragment();
// This is the requestCode that you are sending.
dialogFrag.setTargetFragment(this, 1);
// This is the tag, "dialog" being sent.
dialogFrag.show(getFragmentManager(), "dialog");
通过这三行,您可以声明您的 DialogFragment,设置一个 requestCode(一旦 Dialog 关闭,它将调用 onActivityResult(...),然后您将显示该对话框。就这么简单。
现在,在您的 DialogFragment 中,您只需在 dismiss() 之前直接添加一行,以便将 resultCode 发送回 onActivityResult()。
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();
就是这样。请注意,resultCode 定义为int resultCode,在本例中我设置为resultCode = 1;。
就是这样,您现在可以将 DialogFragment 的结果发送回您的调用 Activity、Fragment 或 FragmentActivity。
此外,此信息似乎是之前发布的,但没有给出足够的示例,所以我想我会提供更多详细信息。
编辑 06.24.2016
对于上面的误导性代码,我深表歉意。但是您肯定无法将结果返回给看到的活动:
dialogFrag.setTargetFragment(this, 1);
设置目标Fragment 而不是Activity。因此,为了做到这一点,您需要使用实现InterfaceCommunicator。
在你的DialogFragment 中设置一个全局变量
public InterfaceCommunicator interfaceCommunicator;
创建一个公共函数来处理它
public interface InterfaceCommunicator {
void sendRequestCode(int code);
}
然后,当您准备好将代码发送回 Activity 时,当 DialogFragment 运行完毕时,您只需在 dismiss(); 之前添加一行 DialogFragment:
interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.
现在在你的活动中你必须做两件事,第一是删除那一行不再适用的代码:
dialogFrag.setTargetFragment(this, 1);
然后实现接口就大功告成了。您可以通过将以下行添加到类最顶部的 implements 子句中来做到这一点:
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
然后@Overrideactivity中的函数,
@Override
public void sendRequestCode(int code) {
// your code here
}
您可以像使用onActivityResult() 方法一样使用此接口方法。除了接口方法为DialogFragments,其他为Fragments。