Метод setCancelable(false) AlertDialog не работает

Я создал AlertDialog, который отлично работает. Он исчезает, если я нажимаю:
1) кнопку выхода из клавиатуры или
2) кнопку возврата с помощью мыши
Чтобы он оставался сфокусированным даже при указанных выше условиях, я добавил '.setCancelable(false)' Заявление во время строительства. Но я все еще вижу, что диалог исчезает. В чем проблема? Пожалуйста, помогите.

Добавлен код:

return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.alert_dialog_icon)
                .setTitle(title)
                .setCancelable(false)
                .setPositiveButton(R.string.alert_dialog_ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton(R.string.alert_dialog_cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();


Env: Android 4.0 на XP Professional.


person lupchiazoem    schedule 18.01.2012    source источник
comment
не могли бы вы загрузить свой код?   -  person Lucifer    schedule 18.01.2012
comment
'.setCancelable(false)' находится в четвертой строке кода.   -  person lupchiazoem    schedule 18.01.2012
comment
Почему вы ставите часть setNegativeButton(), если вы не хотите, чтобы ваш диалог можно было отменить?   -  person Anasthase    schedule 18.01.2012
comment
@Anasthase - я хочу получить ответ пользователя с точки зрения «да» или «нет».   -  person lupchiazoem    schedule 18.01.2012
comment
dialog.setCanceledOnTouchOutside(false)   -  person Mirza Adil    schedule 31.03.2020


Ответы (8)


Является ли это полным кодом? тогда, пожалуйста, измените свой код для настройки setCancelable(false) следующим образом

void showDialog() {
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
            R.string..alert_dialog_two_buttons_title);
    newFragment.setCancelable(false);
    newFragment.show(getFragmentManager(), "dialog");
}
person Sandy    schedule 19.01.2012
comment
Да, это помогло. Большое спасибо за ваш ответ. На самом деле, я готовил ответ, а вы тем временем разместили свой. - person lupchiazoem; 19.01.2012
comment
Все - Поскольку это может помочь вам, предоставление этой информации - setCancelable(false) не работает в приведенном выше коде, потому что AlertDialog создание является частью DialogFragment класса. Пожалуйста, нажмите ссылку «эта» в приведенном выше ответе, которая указывает на полный код. Из описания класса DialogFragment — этот фрагмент содержит объект Dialog, который отображается соответствующим образом в зависимости от состояния фрагмента. Управление диалогом (решение, когда показывать, скрывать, закрывать) здесь должно осуществляться через API, а не с прямыми вызовами диалога. - person lupchiazoem; 19.01.2012
comment
Ссылка не работает. Попробуйте сформулировать ответ, не зависящий от внешних источников. - person Nilzor; 12.04.2020

Ваш диалог настроен на неотменяемость, но фрагмент вашего хоста по-прежнему можно отменить. Установите свой фрагмент с помощью setCancelable(false).

person Green    schedule 03.04.2016
comment
Если вы хотите, чтобы ваш диалог можно было отменить, щелкнув за его пределами, но также хотите получать уведомления о том, что он был отменен, установитеCancelable (true) и переопределите метод отмены диалогов. @Override public void cancel() { - person pstorli; 24.05.2018

Другой рабочий пример:

Шаг 1

Создать класс:

public class DialogActivity extends android.app.DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.myMessage);
        setCancelable(false);
        return builder.create();
   }
}

Шаг 2

Добавьте метод к вашему Activity:

private boolean showDialog() {
    FragmentManager manager = getFragmentManager();
    DialogActivity dialogActivity;
    dialogActivity = new DialogActivity();
    dialogActivity.show(manager, "DialogActivity");
    return true;
}

Шаг 3

Вызовите showDialog(), когда вам нужно показать диалог

person Krzysztof Dziuba    schedule 27.03.2015

dialog.setCanceledOnTouchOutside(false);

setCanceledOnTouchOutside(boolean)

Устанавливает, будет ли это диалоговое окно отменено при касании за пределами окна. Если установлено значение true, диалоговое окно можно отменить, если оно еще не установлено.

person DoruChidean    schedule 19.10.2016

Самый простой способ реализовать «setCancelable» — это реализовать то же самое при вызове диалога в действии; Таким образом, не непосредственно в диалоговом классе.

 Dialog myDialog = new Dialog();
        myDialog.setCancelable( false );
        myDialog.show( getSupportFragmentManager(),"dialog" );
        return true;
person Laiane Oliveira    schedule 23.01.2019

В Kotlin для того, чтобы диалог не закрывался

dialog.isCancelable =false
person pratham kesarkar    schedule 25.03.2019

В зависимости от вашего AlertDialog типа вы можете:

AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.MyAlertDialogLayout).setCancelable(false);

or

AlertDialog alertDialog = builder.create();

alertDialog.setCancelable(false);
person Mohsen Emami    schedule 29.03.2020

В диалоговом фрагменте

Использовал:-

dialog.setCanceledOnTouchOutside(false)

person Mirza Adil    schedule 31.03.2020