[Android] 从DialogFragment接收结果


Answers

正如你here看到的那样here有一个非常简单的方法来做到这一点。

在你的DialogFragment添加一个接口监听器,如:

public interface EditNameDialogListener {
    void onFinishEditDialog(String inputText);
}

然后,添加对该侦听器的引用:

private EditNameDialogListener listener;

这将用于“激活”侦听器方法,还用于检查父Activity / Fragment是否实现此接口(请参见下文)。

在“调用” DialogFragmentActivity / FragmentActivity / Fragment中只需实现此接口。

在你的DialogFragment你需要添加一个你想关闭DialogFragment并返回结果如下:

listener.onFinishEditDialog(mEditText.getText().toString());
this.dismiss();

其中mEditText.getText().toString()将返回给调用的Activity

请注意,如果您想返回其他内容,只需更改侦听器所需的参数即可。

最后,你应该检查接口是否实际上由父活动/片段实现:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the EditNameDialogListener so we can send events to the host
        listener = (EditNameDialogListener) context;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(context.toString()
                + " must implement EditNameDialogListener");
    }
}

这种技术非常灵活,即使您不想要退出对话框,也可以调用返回的结果。

Question

我使用DialogFragments做了很多事情:从列表中选择项目,输入文本。

将值(即列表中的字符串或项目)返回给调用活动/片段的最佳方法是什么?

目前,我正在使调用活动实现DismissListener并为DialogFragment提供对该活动的引用。 然后Dialog在活动中调用OnDimiss方法,活动从DialogFragment对象获取结果。 由于DialogFragment失去对活动的引用,所以非常混乱,并且它不适用于配置更改(方向更改)。

谢谢你的帮助。




我发现一个简单的方法如下:实现这是你的dialogFragment,

  CallingActivity callingActivity = (CallingActivity) getActivity();
  callingActivity.onUserSelectValue("insert selected value here");
  dismiss();

然后在调用Dialog Fragment的活动中创建相应的功能:

 public void onUserSelectValue(String selectedValue) {

        // TODO add your implementation.
      Toast.makeText(getBaseContext(), ""+ selectedValue, Toast.LENGTH_LONG).show();
    }

吐司是要表明它的工作原理。 为我工作。




那么它太晚可能会回答,但这是我从DialogFragment返回的DialogFragment 。 非常类似于@布兰登的回答。 在这里,我从片段调用DialogFragment ,只需将此代码放置在您要调用对话框的位置。

FragmentManager fragmentManager = getFragmentManager();
            categoryDialog.setTargetFragment(this,1);
            categoryDialog.show(fragmentManager, "dialog");

其中categoryDialog是我想要调用的DialogFragment ,然后在实现dialogfragment ,将此代码放置在您要在意图设置数据的位置。 resultCode的值是1,您可以设置它或使用系统定义。

            Intent intent = new Intent();
            intent.putExtra("listdata", stringData);
            getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
            getDialog().dismiss();

现在是回到调用片段并实现此方法的时候了。 如果您希望resultCoderequestCode处于if条件,请检查数据有效性或结果是否成功。

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);        
        //do what ever you want here, and get the result from intent like below
        String myData = data.getStringExtra("listdata");
Toast.makeText(getActivity(),data.getStringExtra("listdata"),Toast.LENGTH_SHORT).show();
    }



在我的情况下,我需要将参数传递给targetFragment。 但我得到了“碎片已经激活”的例外。 所以我在DialogFragment中声明了一个实现了parentFragment的接口。 当parentFragment启动一个DialogFragment时,它将自己设置为TargetFragment。 然后在DialogFragment中调用

 ((Interface)getTargetFragment()).onSomething(selectedListPosition);