Предотвращение закрытия диалога активности Android на внешнем касании

У меня есть действие, которое использует тему.Стиль диалога таков, что это плавающее окно над другим действием. Однако, когда я нажимаю вне диалогового окна (в фоновом режиме), диалоговое окно закрывается. Как я могу остановить это поведение?

18 ответов


Это может помочь вам. Это способ обработки сенсорного внешнего события:

как отменить Диалог, тематический как активность при прикосновении за окном?

ловя событие и ничего не делая, я думаю, вы можете предотвратить закрытие. Но что странно, так это то, что поведение по умолчанию вашего диалога активности должно быть не закрыть себя, когда вы касаетесь снаружи.

(PS: код использует Ему.LayoutParams)


чтобы предотвратить отклонение диалогового окна при нажатии клавиши назад, используйте это

dialog.setCancelable(false);

и предотвратить диалоговое окно от получать уволен на внешнем касании используйте это

 dialog.setCanceledOnTouchOutside(false);

то, что у вас есть, - это действие (даже если оно выглядит как диалог), поэтому вы должны вызвать setFinishOnTouchOutside(false) из вашей деятельности, если вы хотите сохранить его открытым при щелчке фоновой активности.

EDIT: это работает только с Android API уровня 11 или выше


то, что работало для меня было создание DialogFragment установите его, чтобы он не отменялся:

dialog.setCancelable(false);

для более высокого API 10 Диалог исчезает при касании снаружи, тогда как в более низком, чем API 11, диалог не исчезает. Для предотвращения этого, вам нужно сделать:

на styles.xml: <item name="android:windowCloseOnTouchOutside">false</item>

или

на onCreate() способ применения: this.setFinishOnTouchOutside(false);

Примечание: для API 10 и ниже, этот метод не имеет эффекта, и не нужен.


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

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
 alertDialog.setCancelable(false);


установка диалогового окна отменяется, чтобы быть ложным достаточно, и либо вы касаетесь за пределами диалога оповещения или нажмите кнопку Назад сделает диалоговое окно оповещения исчезнет. Поэтому используйте это:

setCancelable(false)

и другая функция больше не необходима: dialog.setCanceledOnTouchOutside(false);

Если вы создаете временный диалог и задаетесь вопросом, чтобы поместить эту строку кода, вот пример:

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(android.R.string.yes, null).show();

Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true); 
//use this to dismiss the dialog on outside click of dialog

dialog.setCanceledOnTouchOutside(false);
//use this for not to dismiss the dialog on outside click of dialog.

смотрите эту ссылку для получения более подробной информации о диалог.

dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity

dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity

при использовании диалога в качестве действия в onCreate добавьте это

setFinishOnTouchOutside(false);

просто

alertDialog.setCancelable(false);

запретить пользователю щелкать вне диалогового окна.


использовать setFinishOnTouchOutside(false) для API > 11 и не волнуйтесь, потому что его поведение по умолчанию android, что диалог с тематикой активности не будет завершен на внешнем касании для API


Я использую это в onCreate(), кажется, работает на любой версии Android; проверено на 5.0 и 4.4.x, не может тестироваться на пряниках, устройствах Samsung (Примечание 1 работает GB) по умолчанию:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        setFinishOnTouchOutside(false);
    }
    else
    {
        getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    }

    super.onCreate(savedInstanceState);

        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

Я думаю, это поможет вам.Это сработало для меня


вот мое решение:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);

я столкнулся с той же проблемой. Чтобы справиться с этим, я установил OntouchListener в диалоге и ничего не делать внутри. Но диалог уволить при вращении экрана тоже. Чтобы исправить это, я установил переменную, чтобы сообщить мне, если диалог обычно отклоняется. Затем я установил OnDismissListener мой диалог и внутри я проверяю переменную. Если диалог имеет dismmiss, обычно я ничего не делаю, или я снова запускаю диалог (и устанавливаю его состояние, как при увольнении в моем случае).


строитель.setCancelable (false);


public void Mensaje (View v){

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("¿Quieres ir a el Menú principal?");
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
    builder.setPositiveButton("SI", null);
    builder.setNegativeButton("NO", null);
    builder.setCancelable(false);
    builder.show();
}

также можно назначить другое действие, реализующее onCancelListener:

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});

Это прекрасный ответ на все ваши вопросы.... Надеюсь, вам понравится кодирование в Android

new AlertDialog.Builder(this)
            .setTitle("Akshat Rastogi Is Great")
            .setCancelable(false)
            .setMessage("I am the best Android Programmer")
            .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            })
            .create().show();