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

时间:2017-08-15 16:02:31

标签: java android android-fragments

我正在尝试使用DialogFragment在MainActivity中显示一个Dialog。根据用户对对话框的反应,我想调用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(自然) 期待片段而没有活动。问题是我不知道在第一个参数中引用什么,因为除了DialogFragment I之外 我正在尝试构建我在代码中完全没有使用Fragments。 所以我想知道你会鼓励哪些策略来解决我的问题(甚至不确定它们是否都可能有效):

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

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

3.使用完全不同的方法(例如,不将方法放在活动中,而是在接口中包含活动和片段实现,但实际上我也想利用例如DialogFragment内部活动的TextViews,所以我认为这可能是一个问题)

我非常感谢任何帮助。

最后一条评论:请注意,我在导入中使用v4支持库以支持向后兼容性,如对话框中的Android教程所示。

这就是为什么我需要使用getSupportFragmentManager()而不是getFragmentManager()来完成现在已经工作的工作的原因。这就是我稍微修改我用超链接引用的代码的原因。

2 个答案:

答案 0 :(得分:1)

getTargetFragmentsetTargetFragment我们都应该用于Fragment to Fragment之间的沟通,

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

  1. 您可以使用界面进行沟通

  2. 您可以使用本地广播

  3. 接口通信

    在对话框片段中创建一个界面

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

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

答案 1 :(得分:0)

您可以简单地使用相同的界面。只需在单独的类中定义接口,并根据您将方法声明为onClickEvent / onSuccess,并在活动中覆盖它,并在方法中的活动中执行任务。并在是/否单击按钮的对话框中调用此方法。