Java 在DialogFragment的onClick方法中从MainActivity调用方法

Java 在DialogFragment的onClick方法中从MainActivity调用方法,java,android,android-fragments,Java,Android,Android Fragments,我正在尝试使用DialogFragment在我的MainActivity中显示一个对话框。根据用户对对话框的反应,我希望调用MainActivity.java文件中定义的方法(例如,onActivityResult,但理想情况下也是自定义方法) 在ashishduh回答了这个问题之后,我将DialogFragment定义如下(在一个单独的java文件中): 相应地,我尝试从以下主要活动开始: public void openYesNoDialog (View view) { Di

我正在尝试使用DialogFragment在我的MainActivity中显示一个对话框。根据用户对对话框的反应,我希望调用MainActivity.java文件中定义的方法(例如,
onActivityResult
,但理想情况下也是自定义方法)

在ashishduh回答了这个问题之后,我将DialogFragment定义如下(在一个单独的java文件中):

相应地,我尝试从以下主要活动开始:

    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\u main.xml布局文件中的按钮触发

我面临的问题是,
setTargetFragment(这个,YES\u NO\u调用)
不起作用,因为“this”对应于我的MainActivity,但是setTargetFragment(自然)是 应为片段且无活动。问题是,我不知道在第一个参数中引用什么,因为除了DialogFragment之外,我 我试图构建我的代码中完全没有使用片段。 因此,我想知道您会鼓励以下哪种策略来解决我的问题(甚至不确定是否所有策略都可行):

1.)使用类似于setTargetFragment的方法,该方法允许设置目标活动。(有点像“setTargetActivity”方法;如果存在这样的方法,这个解决方案对我来说听起来很简单,但我还没有找到类似的方法)

2.)根据片段编写所有内容,并使用类似“MainFragment”的内容,而不是MainActivity。然后,我可以很容易地将这个“MainFragment”作为一个合理的目标片段引用为“this”

3.)使用完全不同的方法(例如,不将方法放在活动中,而是放在活动和片段实现的接口中,但实际上我还想利用DialogFragment中活动的文本视图,因此我认为这可能是个问题)

我非常感谢你的帮助

最后一点意见:请注意,我在导入中使用v4支持库来支持向后兼容性,正如Android教程中关于对话框的建议


例如,这就是为什么我需要使用getSupportFragmentManager()而不是getFragmentManager(),以使现在已经工作的工作正常。这就是我对超链接中提到的代码进行轻微修改的原因。

getTargetFragment
setTargetFragment
这两种代码都应该用于片段之间的通信

对于
活动
片段
的通信,您可以使用两种方式

  • 您可以使用该接口进行通信

  • 你可以使用本地广播

  • 接口通信

    在对话框片段中创建一个接口

    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();
                    }
    
    }
    

    在您的活动中,您可以实现并覆盖该函数,您将在活动中获得回调。

    您可以简单地使用该接口来实现该函数。只需在单独的类中定义接口,并根据您的需要将方法声明为onClickEvent/onSuccess,然后在活动中重写它,并在方法中的活动中执行任务。并在对话框中单击“是/否”按钮调用此方法

    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();
                    }
    
    }