Exceção ao Android "Não é possível adicionar a janela - o token nulo não é para um aplicativo"


134

Recebo a seguinte exceção do Android quando tento abrir uma caixa de diálogo. Alguém pode me ajudar a entender o que está acontecendo e como posso corrigir esse problema?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)

8
Como devemos saber sem postar algum código?
Falmarri 28/10


1
Consulte esta resposta, a principal coisa para postar o link desta resposta é que há uma boa conversa nos comentários sobre essa resposta, descrevendo por que esse problema está surgindo e qual é a melhor maneira de lidar com isso http://stackoverflow.com/a/ 7229248/501483
Dharam

Se você usar o Serviço, leia stackoverflow.com/questions/23516689/… .
CoolMind

Respostas:


421

Eu estou supondo - você está tentando criar o Diálogo com um contexto de aplicativo? Algo assim:

new Dialog(getApplicationContext());

Isto está errado. Você precisa usar um contexto de atividade.

Você tem que tentar como:

new Dialog(YourActivity.this);

1
Obrigado. Mas eu não usei o novo Dialog (getApplicationContext ()); Eu só uso 'new AlertDialog.Builder (mContext);' onde mContext é um referente a uma atividade.
31511 Michael

10
O mContext deve ser MyActivity.this.
Luis

10
Os documentos do Android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) para criar uma caixa de diálogo personalizada apresentam esse erro. Contexto mContext = getApplicationContext (); Caixa de diálogo = nova caixa de diálogo (mContext); Sua correção leva ao diálogo Dialog = new Dialog (this); O que funciona! Obrigado
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html foi corrigido (há algum tempo). Apenas apontando isso para referência. O padrão também foi aprimorado. :)
Martin Marconcini

2
Use getActivity()@SagarDevanga
Pratik Butani

34

Você pode continuar usando getApplicationContext(), mas antes do uso, adicione este sinalizador: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)e o erro não será exibido.

E não se esqueça de adicionar permissão:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Sim, é bem simples. E não se esqueça de adicionar permissão, editei agora.
codezjx

3
Não é possível usar getActivity () em um RecyclerAdapter
Martin Erlic 25/16/16

Isso é :) incrível
Syed Hamza Hassan

Como você adiciona a bandeira?
Conner Dassen

13

No meu caso, eu estava tentando criar meu diálogo assim:

new Dialog(getApplicationContext());

Então eu tive que mudar para:

new Dialog(this);

E funciona bem para mim;)


1
Sua resposta está correta, no entanto, só funcionará quando você estiver no escopo da atividade. Se você estiver em um escopo interno, precisará usar em MyActivity.classvez de thisporque thisse refere a um objeto diferente.
Shahar

1
Além disso, thisgarantirá que você Dialogherda seu tema.
TheRealChx101

12

Tente getParent()no lugar de discussão de contextcomo new AlertDialog.Builder(getParent());Espero que funcione, funcionou para mim.


Por que usar getParent () ?, o que significa?
José Castro

2
Quando você mostra qualquer caixa de diálogo em outra classe que não estende a classe Activity, você pode não obter o contexto dessa classe que está estendendo a Atividade. Portanto, para obter o contexto dentro da sua classe em que você está tentando mostrar a caixa de diálogo, mas não estendendo a Atividade, pode usar o getParent (), que retorna o contexto dessa atividade superior.
Priyank Joshi

1
Obrigado @PriyankJoshi, você salvou meu dia, mas também resolve a estranha exceção "O Android não pode adicionar janelas não é válido; sua atividade está em execução?".
Eslam Yousef Mohammed

Como eu poderia usar o getParent ()?
Vinidog

Obrigado! Funcionou no meu caso. Eu estava ligando, this.parent.getActivity().getApplicationContext()mas this.parent.getActivity()fiz o truque.
Carlodonz 15/02/19

3

Eu estou supondo - você está tentando criar o Diálogo usando.

 getApplicationContext()
 mContext which is passed by activity.

se Você exibir a classe de não atividade de diálogo, precisará passar a atividade como parâmetro.

Activity activity=YourActivity.this;

Agora será um ótimo trabalho.

Se você encontrar algum problema, me avise.


2

Eu tentei com isso no campo de contexto:

this.getActivity().getParent()

e funciona bem para mim. Isto foi de uma classe que se estende de "Fragmento":

public class filtro extends Fragment{...

2

Olá, se você estiver usando o adaptador, pode haver uma chance.
Tudo o que você precisa saber quando você usou qualquer caixa de diálogo no adaptador, getContext (), contexto ou atividade não funcionará em algum momento.

Aqui está o truque que eu usei v.getRootView().getContext() onde v é o objeto de exibição que você está fazendo referência.
Por exemplo.


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class

Obrigado ! poupou meu precioso tempo !! (^_^)
Nice umang 28/06/19

1

Eu tenho a mesma exceção. o que faço para corrigir isso é passar a instância da caixa de diálogo como parâmetro para a função e usá-la em vez de passar apenas o contexto e usar getContext (). esta solução resolve meu problema, espero que ajude


0

Eu recebi essa exceção, quando tentei abrir o Progress Dialog no Cordova Plugin usando abaixo de dois casos,

  1. novo ProgressDialog (this.cordova.getActivity (). getParent ());

  2. novo ProgressDialog (this.cordova.getActivity (). getApplicationContext ());

Mais tarde mudou assim,

novo ProgressDialog (this.cordova.getActivity ());

Está funcionando bem para mim.


0

Use isso e o contexto não funcionou para mim .. mas MyActivityName.this funcionou. Espero que isso ajude quem precisa.


0

Resolvi esse erro adicionando abaixo a permissão do usuário no AndroidManifest.xml

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Além disso, inicialize o diálogo Alerta com Nome da Atividade:

AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);

Para mais detalhes, visite ==> Como criar uma caixa de diálogo de alerta no Android

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.