我想做一个dialog fragment
问“你确定吗?” 回复“是/否”。
我查看了文档,它真的很冗长,到处都是,解释了如何制作高级对话框,但没有完整的代码来制作一个简单的“hello world”类型的对话框。大多数教程使用已弃用的对话框系统。官方博客似乎是不必要的复杂和难以理解。
那么,创建和显示一个非常基本的警报对话框的最简单方法是什么?如果它使用支持库,则可以加分。
DialogFragment 实际上只是一个包装对话框的片段。通过在 DialogFragment 的 onCreateDialog() 方法中创建和返回对话框,您可以将任何类型的对话框放入其中。
下面是一个示例 DialogFragment:
class MyDialogFragment extends DialogFragment{
Context mContext;
public MyDialogFragment() {
mContext = getActivity();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext);
alertDialogBuilder.setTitle("Really?");
alertDialogBuilder.setMessage("Are you sure?");
//null should be your on click listener
alertDialogBuilder.setPositiveButton("OK", null);
alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return alertDialogBuilder.create();
}
}
要创建对话调用:
new MyDialogFragment().show(getFragmentManager(), "MyDialog");
并从某处关闭对话框:
((MyDialogFragment)getFragmentManager().findFragmentByTag("MyDialog")).getDialog().dismiss();
所有这些代码都将与支持库完美配合,只需更改导入以使用支持库类。
那么,创建和显示一个非常基本的警报对话框的最简单方法是什么?如果它使用支持库,则可以加分。
只需创建一个DialogFragment
(SDK 或支持库)并覆盖其onCreateDialog
方法以返回一个AlertDialog
并在其上设置所需的文本和按钮:
public static class SimpleDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage("Are you sure?")
.setPositiveButton("Ok", null)
.setNegativeButton("No way", null)
.create();
}
}
要在用户使用其中一个按钮时执行某些操作,您必须提供 a 的实例DialogInterface.OnClickListener
而不是null
我的代码中的引用。
对于那些使用 Kotlin 和Anko编码的人,您现在可以用 4 行代码进行对话:
alert("Order", "Do you want to order this item?") {
positiveButton("Yes") { processAnOrder() }
negativeButton("No") { }
}.show()
因为 Activity / Fragment 生命周期 @athor & @lugsprog 方法可能会失败, 更优雅的方法是**从方法 onAttach 获取活动上下文并将其存储为弱引用**(&尽量避免 DialogFragment 中的非默认构造函数!,传递任何对话框使用参数的参数),如下所示:
public class NotReadyDialogFragment extends DialogFragment {
public static String DIALOG_ARGUMENTS = "not_ready_dialog_fragment_arguments";
private WeakReference<Context> _contextRef;
public NotReadyDialogFragment() {
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
/** example pulling of arguments */
Bundle bundle = getArguments();
if (bundle!=null) {
bundle.get(DIALOG_ARGUMENTS);
}
//
// Caution !!!
// check we can use contex - by call to isAttached
// or by checking stored weak reference value itself is not null
// or stored in context -> example allowCreateDialog()
// - then for example you could throw illegal state exception or return null
//
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(_contextRef.get());
alertDialogBuilder.setMessage("...");
alertDialogBuilder.setNegativeButton("Przerwij", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return alertDialogBuilder.create();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
_contextRef = new WeakReference<Context>(activity);
}
boolean allowCreateDialog() {
return _contextRef !== null
&& _contextRef.get() != null;
}
编辑: &如果你想关闭对话框,那么:
像这样的东西:
NotReadyDialogFragment dialog = ((NotReadyDialogFragment) getActivity().getFragmentManager().findFragmentByTag("MyDialogTag"));
if (dialog != null) {
Dialog df = dialog.getDialog();
if (df != null && df.isShowing()) {
df.dismiss();
}
}
EDIT2:如果您想将对话框设置为不可取消,您应该像这样更改 onCreatweDialog 返回语句:
/** convert builder to dialog */
AlertDialog alert = alertDialogBuilder.create();
/** disable cancel outside touch */
alert.setCanceledOnTouchOutside(false);
/** disable cancel on press back button */
setCancelable(false);
return alert;