Não consigo entender por que isso está acontecendo. Este código:
mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);
funciona muito bem. No entanto, este código:
mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);
lança a seguinte exceção:
W/WindowManager( 569): Attempted to add window with non-application token WindowToken{438bee58 token=null}. Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049): at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049): at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049): ... 11 more
Alguma ideia de por que isso está acontecendo? Estou chamando isso do onCreate
método.
android
progressdialog
Felix
fonte
fonte
Fragment
, stackoverflow.com/questions/24825114/…Respostas:
Qual versão da API você está usando? Se eu estiver certo sobre qual é o problema, isso foi corrigido no Android 1.6 (API versão 4).
Parece que a referência do objeto que
getApplicationContext()
está retornando aponta apenas para nulo. Acho que você está tendo um problema semelhante ao que eu tive, pois parte do código doonCreate()
está sendo executado antes que a janela termine de ser construída. Isso vai ser um hack, mas tente lançar um novo Thread em algumas centenas de milissegundos (IIRC: 300-400 pareceu funcionar para mim, mas você precisará mexer) que abre seu ProgressDialog e inicia tudo o que você precisava ( por exemplo, rede IO). Algo assim:fonte
Estou usando a versão 2.1 do Android com API de nível 7. Enfrentei este problema (ou semelhante) e resolvi usando este:
em vez disso:
Espero que isto ajude :)
fonte
Para mim funcionou mudando
para
O estranho é que o primeiro pode ser encontrado no tutorial do google e as pessoas erram nisso ..
fonte
this
sozinho não funcionará se você estiver fazendo isso dentro de um ouvinte de clique, por exemplo.Não acho que seja um problema de tempo em torno de um contexto de aplicativo nulo
Tente estender o aplicativo dentro do seu aplicativo (ou apenas use-o se você já tiver)
Disponibilize a instância como um singleton privado. Isso nunca é nulo
Faça um auxiliar estático em MyApp (que usará o singleton)
ESTRONDO!!
Além disso, verifique a resposta do engenheiro do Android aqui: WindowManager $ BadTokenException
Agora, eu concordo, não faz sentido que o método pegue um parâmetro de contexto, em vez de atividade.
fonte
Depois de ler as respostas acima, descobri que, para minha situação, o seguinte corrigiu o problema.
Isso gerou o erro
Com base nas respostas anteriores que sugeriam que o contexto era o errado, alterei getApplicationContext () para recuperar o contexto da Visualização passada para o método onClick dos botões.
Não entendo totalmente o funcionamento do Java, então posso estar errado, mas estou supondo que, para minha situação específica, a causa pode estar relacionada ao fato de que o trecho acima foi definido em uma classe Abstract Activity; herdado e usado por muitas Activities, talvez isso tenha contribuído para o fato de getApplicationContext () não retornar um contexto válido ?? (Apenas um palpite).
fonte
Estou criando uma visualização de mapa com sobreposições detalhadas. Eu estava criando meu itemizedoverlay como este de minha mapActivity:
Descobri que obteria a exceção "android.view.WindowManager $ BadTokenException: Não foi possível adicionar janela - o token null não é para um aplicativo" exceção quando o método onTap do meu itemizedoverlay foi acionado (quando o local é tocado no mapview).
Descobri que, se simplesmente passasse 'this' em vez de 'getApplicationContext ()' para meu construtor, o problema desapareceria. Isso parece apoiar a conclusão de alienjazzcat. esquisito.
fonte
Para atividades mostradas em TabActivities, use getParent ()
ao invés de
fonte
Para Android 2.2,
use este código:
em vez deste código:
Observação: Minha caixa de diálogo personalizada é criada fora do
activity.onCreateDialog(int dialogId)
método.fonte
Experimentar -
fonte
Tive um problema semelhante com fragmentos (de compatibilidade) em que usar um
getActivity()
dentro oProgressDialog.show()
travava. Eu concordo que é por causa do tempo.Uma possível correção:
ao invés de usar
Coloque o mContext o mais cedo possível para dar a ele mais tempo para capturar o contexto. Ainda não há garantia de que isso funcionará, apenas reduz a probabilidade de um travamento. Se ainda não funcionar, você terá que recorrer ao hack do cronômetro (que pode causar outros problemas de tempo, como ignorar a caixa de diálogo posteriormente).
Claro, se você pode usar
this
ouActivityName.this
, é mais estável porquethis
já aponta para algo. Mas em alguns casos, como em certas arquiteturas Fragment, não é uma opção.fonte
(Para referências futuras)
Acho que é porque há diferenças no contexto do aplicativo e no contexto da atividade, conforme explicado aqui: http://www.doubleencore.com/2013/06/context/
O que significa que não podemos mostrar o diálogo usando o contexto do aplicativo. É isso aí.
fonte
Para usar diálogos dentro de atividades, faça desta forma:
Para usar diálogos dentro de fragmentos, faça desta forma:
É isso ^ _ ^
fonte
O que fiz para contornar isso foi criar uma classe base para todas as minhas atividades, onde armazeno dados globais. Na primeira atividade, salvei o contexto em uma variável em minha classe base assim:
Classe Base
Primeira atividade derivada da classe base
Então eu uso mycontext em vez de getApplicationContext ao criar diálogos.
fonte
Se você estiver chamando ProgressDialog.show () em um fragmento, converter o mContext para Activity funcionou para mim.
fonte
Esse é um problema comum. Use em
this
vez degetApplicationContext()
Isso deve resolver seu problemafonte
Implementei a caixa de diálogo de alerta para a exceção gerada na visualização da atividade atual.
Dada a mesma exceção de janela. Eu escrevo o código para alerta de onCreate (). Tão simples que usei
context = this;
após asetContentView()
instrução noonCreate()
método. Pegue a variável de contexto como global, comoContext context;
Amostra de código é
A amostra do método de alerta é
Funciona bem para mim.Na verdade eu pesquisei esse erro no StackOverflow e encontrei esta consulta.Depois de ler todas as respostas deste post, tentei dessa forma para que funcione. Achei que esta é uma solução simples para superar a exceção.
Obrigado, rajendar
fonte
se você tiver um problema no groupActivity, não use isso. PARENT é uma estática do ActivityGroup Pai.
ao invés de
fonte
Uma caixa de diálogo é sempre criada e exibida como parte de uma atividade. Você precisa passar em um contexto de atividade em vez do contexto de aplicativo.
http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog
fonte