我正在尝试使用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()来完成现在已经工作的工作的原因。这就是我稍微修改我用超链接引用的代码的原因。
答案 0 :(得分:1)
getTargetFragment
和setTargetFragment
我们都应该用于Fragment to Fragment之间的沟通,
对于Activity
到Fragment
通信,您可以使用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中获得回调。
答案 1 :(得分:0)
您可以简单地使用相同的界面。只需在单独的类中定义接口,并根据您将方法声明为onClickEvent / onSuccess,并在活动中覆盖它,并在方法中的活动中执行任务。并在是/否单击按钮的对话框中调用此方法。