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

标签 java android android-fragments

我正在尝试使用 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/

相关文章:

java - 如何在父 fragment Activity 的 viewpager 中的两个列表 fragment 之间进行通信

android - onContextItemSelected 未在 Fragment 中调用

java - 简单缩放动画期间的中心 View

java - 使用 JSoup 抓取网页

java - 我不断收到 java.lang.ArrayIndexOutOfBoundsException : 500

java - 问 : Saxon XQuery Custom Resolver

java - Hive 爆炸功能

android - 如何使 TextInputLayout 中的错误消息显示在中心

java - 解析对列表的奇怪 Json 响应

java - Activity 之间的全局对象