繁体   English   中英

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

[英]Invoking methods from MainActivity within the onClick methods of a DialogFragment

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

在ashishduh对这个问题的答复之后,我将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外,我在代码中完全没有使用Fragments。 因此,我想知道您会鼓励采用以下哪种策略来解决我的问题(甚至不确定它们是否都可能有效):

1.)使用类似于setTargetFragment的方法,该方法允许设置目标Activity。 (某种“ setTargetActivity”方法;如果存在这种情况,此解决方案对我来说最简单,但我还没有发现任何类似的东西)。

2.)用Fragments编写所有内容,并使用“ MainFragment”代替MainActivity。 然后,我可以轻松地将此“ MainFragment”作为带有“ this”的合理目标片段。

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

非常感谢您的帮助。

最后一条评论:请注意,我在导入中使用v4支持库来支持向后兼容性,如Dialogs上的Android教程中所建议。

例如,这就是为什么我需要使用getSupportFragmentManager()而不是getFragmentManager()来使当前已经在工作的东西起作用的原因。 因此,这就是我对超链接所引用的代码进行微小修改的原因。

我们应使用getTargetFragmentsetTargetFragment进行Fragment与Fragment之间的通信,

对于“ Activity Fragment通信,可以使用两种方法

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

  2. 您可以使用本地广播

接口通讯

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

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中获得回调。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM