Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Весь этот код будет отлично работать с библиотекой поддержки, просто изменив импорт для использования классов библиотеки поддержки.

Ответ 2

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

Просто создайте 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 ссылок из моего кода.

Ответ 3

Для тех, кто программирует с Kotlin и Anko, теперь вы можете делать диалоги в 4 строки кода:

alert("Order", "Do you want to order this item?") {
    positiveButton("Yes") { processAnOrder() }
    negativeButton("No") { }
}.show()

Ответ 4

из-за жизненного цикла Activity/Fragment Подход @athor и @lugsprog может завершиться неудачно, более элегантный способ состоит в том, чтобы ** получить контекст активности из метода onAttach и сохранить его как слабую ссылку ** (и попытаться избежать конструктора по умолчанию в диалоговом окне "Диалог", чтобы передать любой аргумент аргументам использования диалога) следующим образом:

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: & Амп; если вы хотите отменить диалог, то:

  • попробуйте его
  • проверить, существует ли он
  • проверьте, показывает ли он
  • смещать

что-то вроде этого:

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

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