gpt4 book ai didi

java - 在 DialogFragment 的 onClick 方法中调用 MainActivity 的方法

转载 作者:行者123 更新时间:2023-12-02 12:22:05 24 4
gpt4 key购买 nike

我正在尝试使用 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() 来使现在已经在工作的东西起作用。这就是我对超链接引用的代码进行轻微修改的原因。

最佳答案

getTargetFragmentsetTargetFragment 都应该用于 Fragment 与 Fragment 之间的通信,

对于ActivityFragment的通信,可以使用2种方式

  1. 您可以使用接口(interface)进行通信

  2. 您可以使用本地广播

接口(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com