Методът 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

В DialogFragment

Използван:-

dialog.setCanceledOnTouchOutside(false)

person Mirza Adil    schedule 31.03.2020