我正在尝试使用 DialogFragment 在我的 MainActivity 中显示对话框。根据用户对对话框的 react ,我想调用 MainActivity.java 文件中定义的方法(例如 onActivityResult
,但理想情况下也是自定义方法)。
根据 ashishduh 在 this 上的回复问题,我将 DialogFragment 定义如下(在单独的 java 文件中):
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
public class YesNoDialog extends DialogFragment {
public static final String ARG_TITLE = "YesNoDialog.Title";
public static final String ARG_MESSAGE = "YesNoDialog.Message";
public YesNoDialog() {}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{ Bundle args = getArguments();
String title = args.getString(ARG_TITLE);
String message = args.getString(ARG_MESSAGE);
return new AlertDialog.Builder(getActivity())
.setTitle(title)
.setMessage(message)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);
}
})
.create();
}
}
相应地,我尝试从 MainActivity 启动它,如下所示:
public void openYesNoDialog (View view) {
DialogFragment dialog = new YesNoDialog();
Bundle args = new Bundle();
args.putString(YesNoDialog.ARG_TITLE, "title");
args.putString(YesNoDialog.ARG_MESSAGE, "message");
dialog.setArguments(args);
dialog.setTargetFragment(this, YES_NO_CALL);
dialog.show(getSupportFragmentManager(), "tag");
}
其中 openYesNoDialog
由 Activity_main.xml 布局文件中的按钮触发。
我面临的问题是 setTargetFragment(this, YES_NO_CALL)
不起作用,因为“this”对应于我的 MainActivity,但 setTargetFragment 是(自然)
期待一个 Fragment 并且没有 Activity。问题是我不知道在第一个参数中引用什么,因为除了 DialogFragment 我
我正在尝试构建我的代码中完全没有使用 fragment 。
因此,我想知道您会鼓励使用以下哪种策略来解决我的问题(甚至不确定它们是否都可能有效):
1.) 使用类似于 setTargetFragment 的方法,它允许设置目标 Activity。 (有点像“setTargetActivity”方法;如果存在这样的事情,这个解决方案对我来说听起来最简单,但我还没有找到类似的东西)。
2.) 用 Fragments 编写所有内容,并使用类似“MainFragment”的内容而不是 MainActivity。然后我可以轻松地将这个“MainFragment”引用为带有“this”的合理目标 fragment 。
3.)使用完全不同的方法(例如,不将方法放在 Activity 中,而是将方法放在 Activity 和 fragment 实现的接口(interface)中,但实际上我也想利用例如 DialogFragment 内部 Activity 的 TextViews,所以我认为这可能是一个问题)
非常感谢您的帮助。
最后一点评论:请注意,我在导入中使用 v4 支持库来支持向后兼容性,如有关对话框的 Android 教程中的建议。
这就是为什么我需要使用 getSupportFragmentManager() 而不是 getFragmentManager() 来使现在已经在工作的东西起作用。这就是我对超链接引用的代码进行轻微修改的原因。
最佳答案
getTargetFragment
和 setTargetFragment
都应该用于 Fragment 与 Fragment 之间的通信,
对于Activity
到Fragment
的通信,可以使用2种方式
您可以使用接口(interface)进行通信
您可以使用本地广播
接口(interface)通讯
在对话框 fragment 中创建一个界面,
public class YesNoDialog extends DialogFragment {
public interface OnDialogActionListener {
public void onClickDialog();
}
private OnDialogActionListener mListener;
@Override
public void onAttach(Context context) {
mListener = (OnDialogActionListener) context;
}
// Your code
@Override
public void onClick(DialogInterface dialog, int which)
{
mListener.onClickDialog();
}
}
并且在您的 Activity 中您可以实现并覆盖该函数,您将在您的 Activity 中得到回调。
关于java - 在 DialogFragment 的 onClick 方法中调用 MainActivity 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45696780/