最简单的是/否对话框片段

我想做一个dialog fragment ,询问“你确定吗?” 回答“是/否”。

我已经看了文档 ,它真的很详细,遍布各处,解释如何使高级对话框,但没有完整的代码,使一个简单的“你好世界”类对话框。 大多数教程使用不推荐使用的对话框系统。 官方的博客似乎不必要的复杂和难以理解。

那么,创build和显示一个真正基本的警报对话框的最简单的方法是什么? 奖励积分,如果它使用的支持库。

DialogFragment实际上只是一个包装对话框的片段。 通过在DialogFragment的onCreateDialog()方法中创build并返回对话框,可以在其中放置任何types的对话框。

下面是一个例子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(); } } 

创build对话框调用:

 new MyDialogFragment().show(getFragmentManager(), "MyDialog"); 

并从某处解雇对话:

 ((MyDialogFragment)getFragmentManager().findFragmentByTag("MyDialog")).getDialog().dismiss(); 

所有这些代码都可以与支持库完美协作,只需将导入更改为使用支持库类即可。

那么,创build和显示一个真正基本的警报对话框的最简单的方法是什么? 奖励积分,如果它使用的支持库。

只需创build一个DialogFragment (sdk或支持库)并重写它的onCreateDialog方法,返回一个AlertDialog ,并在其上设置所需的文本和button:

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

当用户使用其中一个button时,要做一些事情,你必须提供一个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; } 

编辑:如果你想解散对话,然后:

  1. 尝试得到它
  2. 检查它是否存在
  3. 检查它是否显示
  4. 解雇

像这样的东西:

  NotReadyDialogFragment dialog = ((NotReadyDialogFragment) getActivity().getFragmentManager().findFragmentByTag("MyDialogTag")); if (dialog != null) { Dialog df = dialog.getDialog(); if (df != null && df.isShowing()) { df.dismiss(); } } 

编辑2: &如果你想设置对话框不可取消你应改变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;