Простейший фрагмент диалога «да / нет»

Я хотел бы сделать dialog fragment который спрашивает: «Вы уверены?» С ответом «да / нет».

Я просмотрел документацию, и это действительно многословно, переходя повсюду, объясняя, как создавать расширенные диалоговые окна, но не имеет встроенного кода для создания простого диалогового окна «привет мир». В большинстве руководств используется устаревшая система диалогового окна. Официальный блог кажется излишне сложным и трудным для понимания.

Итак, какой самый простой способ создать и отобразить действительно базовый диалог оповещений? Бонусные баллы, если он использует библиотеку поддержки.

Solutions Collecting From Web of "Простейший фрагмент диалога «да / нет»"

Диалоговый фрагмент – это всего лишь фрагмент, который обертывает диалог. Вы можете поместить туда какой-либо диалог, создав и вернув диалоговое окно в методе 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(); } } 

Чтобы что-то сделать, когда пользователь использует одну из кнопок, вам нужно будет предоставить экземпляр 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; } 

EDIT: & если вы хотите отменить диалог, тогда:

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

EDIT2: & if u хотите установить диалог как не отмененный u должен изменить 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;