有一种更简单的方法可以从DialogFragment中获取结果。
首先,在您的Activity、Fragment或FragmentActivity中,您需要添加以下信息:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1) {
if(resultCode == 1) {
}
}
}
requestCode
就是你为所调用的DialogFragment设定的int类型标签,我马上就会展示它的使用方法。而resultCode
则是你从DialogFragment中发送回来,告知当前等待结果的Activity、Fragment或FragmentActivity发生了什么事情的代码。
下一步需要添加的代码是对DialogFragment的调用。这里提供一个例子:
DialogFragment dialogFrag = new MyDialogFragment();
dialogFrag.setTargetFragment(this, 1);
dialogFrag.show(getFragmentManager(), "dialog");
使用这三行代码声明DialogFragment,设置一个requestCode(该requestCode将在对话框关闭后调用onActivityResult(...)),然后显示对话框。就是这么简单。
现在,在DialogFragment中,您只需要在dismiss()
之前添加一行代码,以便向onActivityResult()发送一个resultCode。
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();
就是这样。请注意,int resultCode
被定义为 resultCode = 1;
在这种情况下。
现在你可以将DialogFragment的结果发送回调用它的Activity、Fragment或FragmentActivity中。
此前已有类似的信息发布,但没有给出充分的示例,因此我会提供更多详细信息。
编辑 06.24.2016对于上面误导的代码,我表示歉意。但显然不能像下面这行代码那样将结果发送回activity:
dialogFrag.setTargetFragment(this, 1);
要设置目标为Fragment
而不是Activity
。因此,您需要实现一个InterfaceCommunicator
。
在您的DialogFragment
中设置一个全局变量。
public InterfaceCommunicator interfaceCommunicator;
创建一个公共函数来处理它
public interface InterfaceCommunicator {
void sendRequestCode(int code);
}
当您准备将代码发送回Activity
以在运行完成DialogFragment
后执行时,只需在dismiss();
之前添加以下行:
interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.
您现在的任务是要做两件事情,第一件是删除那一行不再适用的代码:
dialogFrag.setTargetFragment(this, 1)
然后实现接口,就完成了。你可以通过将以下行添加到类顶部的implements
子句中来实现:
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
然后在活动中 @Override
函数。
@Override
public void sendRequestCode(int code) {
}
您可以像使用onActivityResult()
方法一样使用此接口方法。只不过这个接口方法是用于DialogFragments
,而另一个是用于Fragments
。
Activity
和DialogFragment
都可能被重新创建。使用传递给onAttach(Activity activity)
的Activity
是正确和推荐的方式。 - sstn