Impedir que o diálogo de atividades do Android seja fechado com o toque externo


229

Eu tenho uma atividade que está usando o estilo Theme.Dialog, de modo que seja uma janela flutuante sobre outra atividade. No entanto, quando clico fora da janela de diálogo (na atividade em segundo plano), a caixa de diálogo é fechada. Como posso parar esse comportamento?


1
Por que você faria isso? Se o comportamento que você deseja é de uma caixa de diálogo, por que não usar uma caixa de diálogo? Chegando à sua pergunta, acho que não há uma solução para isso.
precisa saber é o seguinte

As caixas de diálogo @KumarBibek são limitadas quando se trata de personalizações de layout ... é por isso que uma atividade. Mesmo os docs desenvolvedor recomenda esta abordagem para uma personalização flexível
Leo

1
E o que o OP deseja é uma caixa de diálogo Modal , ou seja, uma caixa de diálogo que força o usuário a responder, como OK ou Sim / Não. O usuário não deve poder apenas clicar fora.
22716 Scott Scott (

Respostas:


34

Isso pode ajudá-lo. É uma maneira de lidar com o toque fora do evento:

Como cancelar um diálogo com o tema Atividade, quando tocado fora da janela?

Ao assistir ao evento e não fazer nada, acho que você pode impedir o fechamento. Mas o que é estranho, porém, é que o comportamento padrão do seu diálogo de atividades não deve ser fechado quando você toca do lado de fora.

(PS: o código usa WindowManager.LayoutParams)


1
O objeto não é uma caixa de diálogo, é uma Atividade que usa o estilo da caixa de diálogo. A atividade não possui esse método e não pode ser transmitida para o Diálogo.
Fergusmac

seu post é exatamente o oposto do que foi perguntado. ele perguntou como impedir o fechamento e não como causar isso.
ChuckKelly

4
Foi o que ele explicou com "Ao capturar o evento e não fazer nada, acho que você pode impedir o fechamento".
metter

4
por algum motivo, depois de executar todo o FLAG_NOT_MODAL, WATCH_OUTSIDE_TOUCH, o toque externo não fecha as atividades, mas o botão por trás da atividade é clicado. alguma ideia para isso?
Njzk2

Observe que as caixas de diálogo têm uma sombra (pelo menos até agora (8.0)): se você clicar na sombra, o Android interpretará esse clique exatamente como estava dentro da caixa de diálogo. Só queria compartilhar isso com o mundo, levei 10 minutos para obtê-lo.
Lorenzo Von Matterhorn

458

Para impedir que a caixa de diálogo seja descartada com a tecla Voltar pressionada, use este

dialog.setCancelable(false);

E para impedir que a caixa de diálogo seja dispensada com toque externo, use este

 dialog.setCanceledOnTouchOutside(false);

4
Esta resposta é útil, mas esta pergunta é sobre atividade usando o atributo Theme.Dialog.
Paresh Mayani

15
Eu sei quando percebo que é tarde demais, pois ajudou muitas pessoas a não excluí-lo.
precisa saber é o seguinte

12
Eu sei que isso realmente não se refere à questão, mas isso me ajudou. Obrigado!
dennisdrew

5
Esta é a melhor resposta. Suspeito que a maioria das pessoas que encontra essa pergunta esteja procurando uma maneira de impedir que o padrão se AlertDialogfeche ao ar livre, e é isso que essa resposta fornece.
Aroth 09/08/16

20
Em versões mais recentes do AlertDialog, você só precisa usarsetCancelable(false)
Kobi Tate

120

O que você realmente tem é uma Atividade (mesmo que pareça um Diálogo); portanto, você deve ligar setFinishOnTouchOutside(false)da sua atividade se quiser mantê-la aberta quando a atividade em segundo plano for clicada.

EDIT: funciona apenas com a API do Android nível 11 ou superior


4
Isso não impede que você pressione o botão "voltar" em sua atividade. Então, você também precisará substituir onBackPressed()fazendo nada dentro do corpo
Alex Bonel

Não está impedindo o botão "voltar" nessa caixa de diálogo Atividade sem onBackPressed (). Funciona perfeitamente com this.setFinishOnTouchOutside (false).
Kunalxigxag

68

O que funcionou para mim foi criar DialogFragmentum conjunto para não ser cancelável:

dialog.setCancelable(false);

1
Não ajuda. Esta pergunta é sobre atividades, não caixas de diálogo.
22816 Scott Biggs

20

Ao usar o diálogo como uma atividade no onCreate, adicione este

setFinishOnTouchOutside(false);

17

Para a API 10 superior, o Diálogo desaparece quando tocado do lado de fora, enquanto que na API 11 inferior, o Diálogo não desaparece. Para evitar isso, você precisa fazer:

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

OU

No onCreate()método, use:this.setFinishOnTouchOutside(false);

Nota: para a API 10 e inferior, esse método não tem efeito e não é necessário.


14

Definir o cancelamento da caixa de diálogo como falso é suficiente e, se você tocar fora da caixa de diálogo de alerta ou clicar no botão Voltar, a caixa de diálogo de alerta desaparecerá. Então use este:

setCancelable(false)

E a outra função não é mais necessária: dialog.setCanceledOnTouchOutside(false);

Se você estiver criando uma caixa de diálogo temporária e pensando em colocar essa linha de código, aqui está um exemplo:

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

12

Use este código que está funcionando para mim

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


essa deve ser a resposta correta, se ele puder fazer a pergunta correta!
alijunior

2
Essa seria a resposta correta, se o OP estivesse perguntando sobre diálogos ! Mas a pergunta é sobre atividades - um caso bem diferente.
Scott Biggs

11
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.

Assista a este link para obter mais detalhes sobre o diálogo.

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

Observe que a pergunta se refere às atividades usadas como caixas de diálogo, NÃO à classe Dialog.
22716 Scott Scott

8

Simplesmente,

alertDialog.setCancelable(false);

impedir que o usuário clique fora da caixa de diálogo.


7

A caixa de diálogo de alerta foi descontinuada; portanto, use a caixa de diálogo Caixa de diálogo = nova caixa de diálogo (this);

Para evitar fechar com toque externo

dialog.setCanceledOnTouchOutside(false);

5

Use setFinishOnTouchOutside(false)para API> 11 e não se preocupe, porque o comportamento padrão do seu Android é que a caixa de diálogo com atividades não seja finalizada com o toque externo da API <11 :) !!


5

Eu uso isso no onCreate (), parece funcionar em qualquer versão do Android; testados no 5.0 e 4.4.x, não é possível testar no pão-de-espécie, os dispositivos Samsung (Nota 1 executando GB) têm o seguinte padrão:

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

    super.onCreate(savedInstanceState);

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

Acho que isso vai ajudá-lo.


1
Tente também explicar por que isso funcionará ... Apenas um despejo de código não é uma boa resposta.
Codebender 14/09/15

3

Aqui está a minha solução:

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

2

Também é possível atribuir diferentes ações implementando onCancelListener:

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

Como posso identificar se o cancelamento foi chamado devido a tocar fora da caixa de diálogo de alerta?
Cegprakash

Muito útil para criar ações personalizadas ao tocar fora de uma caixa de diálogo de alerta!
31519 Adam Adam

1

Eu estava enfrentando o mesmo problema. Para lidar com isso, defino OntouchListenera na caixa de diálogo e não faço nada dentro. Mas o Diálogo também dispensa ao girar a tela. Para corrigi-lo, defino uma variável para me dizer se a caixa de diálogo é normalmente descartada. Em seguida, defino um OnDismissListenerna minha caixa de diálogo e, dentro de mim, verifico a variável. Se a caixa de diálogo normalmente não funciona, eu não faço nada, ou então eu a executo novamente (e definindo o estado dele como ao demitir no meu caso).


1

builder.setCancelable (false);


public void Mensaje (exibição 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();
}

1
Oi Alex. Bem-vindo ao StackOverflow e obrigado pela sua resposta. Você poderia editar sua resposta para descrever o que seu código faz e como isso resolve o problema do OP? As respostas apenas de código são desencorajadas, pois não ensinam ou explicam o porquê . Obrigado!
Tim Malone

-1

Esta é a resposta perfeita para todas as suas perguntas .... Espero que você goste de codificar no 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();

Obrigado por este trecho de código, que pode fornecer ajuda imediata e limitada. Uma explicação adequada melhoraria bastante seu valor a longo prazo, mostrando por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
Maximilian Peters
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.