Estou tentando abrir uma janela de diálogo, mas toda vez que tento abri-la, gera essa exceção:
Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
at android.view.ViewRoot.setView(ViewRoot.java:460)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.app.Dialog.show(Dialog.java:238)
at android.app.Activity.showDialog(Activity.java:2413)
Estou criando chamando showDialog
com o ID do display. O onCreateDialog
manipulador registra bem e eu posso percorrê-lo sem problemas, mas o anexei, pois parece que estou perdendo alguma coisa:
@Override
public Dialog onCreateDialog(int id)
{
Dialog dialog;
Context appContext = this.getApplicationContext();
switch(id)
{
case RENAME_DIALOG_ID:
Log.i("Edit", "Creating rename dialog...");
dialog = new Dialog(appContext);
dialog.setContentView(R.layout.rename);
dialog.setTitle("Rename " + noteName);
break;
default:
dialog = null;
break;
}
return dialog;
}
Há algo faltando nisso? Algumas perguntas falaram sobre ter esse problema ao criar uma caixa de diálogo onCreate
, o que acontece porque a atividade ainda não foi criada, mas isso é proveniente de uma chamada de um objeto de menu e a appContext
variável parece estar corretamente preenchida no depurador.
Você não pode exibir uma janela / caixa de diálogo do aplicativo por meio de um contexto que não é uma atividade. Tente passar uma referência de atividade válida
fonte
activity.this
eactivity.getBaseContext()
sem sucesso. Qualquer ajuda?.this
.O mesmo acontece na coisa getApplicationContext.
Os documentos no site android dizem para usá-lo, mas não funciona ... grrrrr :-P
Apenas faça:
"this" é geralmente sua atividade a partir da qual você inicia a caixa de diálogo.
fonte
Os documentos do Android sugerem o uso de getApplicationContext ();
mas não funcionará, em vez de usar sua atividade atual ao instanciar AlertDialog.Builder ou AlertDialog ou Dialog ...
Ex:
ou
fonte
Em vez de
getApplicationContext()
, basta usarActivityName.this
fonte
Eu tive um problema semelhante em que tive outra classe, algo como isto:
Funcionava bem na maioria das vezes, mas às vezes falhava com o mesmo erro. Então eu percebo que
MyActivity
eu tinha ...Como eu estava segurando o objeto como
static
, uma segunda execução do código ainda mantinha a versão original do objeto e, portanto, ainda estava se referindo ao original.Activity
, que não existia mais.Erro estúpido bobo, especialmente porque eu realmente não precisava segurar o objeto como
static
em primeiro lugar ...fonte
Apenas mude para
Ao invés de
fonte
Outra solução é definir o tipo de janela para uma caixa de diálogo do sistema:
Isso requer a
SYSTEM_ALERT_WINDOW
permissão:Como dizem os documentos:
Esta é uma solução que você deve usar apenas se precisar de uma caixa de diálogo que não esteja anexada a uma atividade.
fonte
Não use
getApplicationContext()
na declaração de discagemSempre use
this
ou seuactivity.this
fonte
Para diálogos aninhados, esse problema é muito comum, funciona quando
é usado em vez de
essa alternativa.
fonte
Isso funcionou para mim--
Usar
fonte
Você também pode fazer isso
Isso funcionou para mim !!
fonte
Como foi dito, você precisa de uma Atividade como contexto para a caixa de diálogo, use "YourActivity.this" para um contexto estático ou verifique aqui como usar uma dinâmica em um modo de segurança
fonte
Tente redefinir
dialog
o tipo da janela paraNão se esqueça de usar a permissão
android.permission.SYSTEM_ALERT_WINDOW
fonte
Texto aqui: -
use isso para obter
activity
contexto paraprogressdialog
ou
progressdialog = new ProgressDialog(this);
use isso para obter o contexto do aplicativo para
BroadcastListener
nãoprogressdialog
.fonte
A melhor e a maneira mais segura de mostrar um 'ProgressDialog' em um AsyncTask, evitando problemas de vazamento de memória, é usar um 'Handler' com Looper.main ().
depois no 'onCreate'
Agora você terminou a parte de configuração. Agora chame 'showProgress ()' e 'hideProgress ()' no AsyncTask.
fonte