Android "Impossibile aggiungere la finestra - token null non è per un'applicazione"


134

Ottengo la seguente eccezione Android quando provo ad aprire una finestra di dialogo. Qualcuno può aiutarmi a capire cosa sta succedendo e come posso risolvere questo 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
Come dovremmo sapere senza pubblicare un codice?
Falmarri,


1
Si prega di fare riferimento a questa risposta, la cosa principale per pubblicare il collegamento di questa risposta è che c'è una bella conversazione nei commenti su questa risposta che descrive perché questo problema sta arrivando e qual è il modo migliore per affrontarlo http://stackoverflow.com/a/ 7229248/501483
dharam

Se si utilizza il servizio, leggere stackoverflow.com/questions/23516689/… .
CoolMind

Risposte:


421

Suppongo che stai cercando di creare una finestra di dialogo con un contesto applicativo? Qualcosa come questo:

new Dialog(getApplicationContext());

Questo è sbagliato. È necessario utilizzare un contesto di attività.

Devi provare come:

new Dialog(YourActivity.this);

1
Grazie. Ma non ho usato la nuova finestra di dialogo (getApplicationContext ()); Uso solo "new AlertDialog.Builder (mContext);" dove mContext è un riferimento a un'attività.
michael

10
Quindi mContext dovrebbe essere MyActivity.this.
Luis

10
I documenti Android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) per la creazione di una finestra di dialogo personalizzata presentano questo errore. Contesto mContext = getApplicationContext (); Finestra di dialogo = nuova finestra di dialogo (mContext); La tua correzione porta a Dialog dialog = new Dialog (this); Che funziona! Grazie
bnieland,

1
developer.android.com/guide/topics/ui/dialogs.html è stato corretto (da un po 'di tempo). Basta sottolineare questo per riferimento. Anche il modello è stato migliorato. :)
Martin Marconcini,

2
Usa getActivity()@SagarDevanga
Butani il

34

È possibile continuare a utilizzare getApplicationContext(), ma prima dell'uso, è necessario aggiungere questo flag: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)e l'errore non verrà visualizzato.

E non dimenticare di aggiungere l'autorizzazione:

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

Sì, è abbastanza semplice. E non dimenticare di aggiungere l'autorizzazione, ho modificato proprio ora.
codezjx,

3
Impossibile utilizzare getActivity () in un RecyclerAdapter
Martin Erlic,

È fantastico :)
Syed Hamza Hassan,

Come si aggiunge la bandiera?
Conner Dassen,

13

Nel mio caso stavo cercando di creare la mia finestra di dialogo in questo modo:

new Dialog(getApplicationContext());

Quindi ho dovuto cambiare per:

new Dialog(this);

E funziona bene per me;)


1
La tua risposta è corretta, tuttavia funzionerà solo quando ti trovi nell'ambito dell'attività. Se sei in un ambito interno, devi usare MyActivity.classinvece di thisperché si thisriferisce a un oggetto diverso.
Shahar,

1
Inoltre, thisfarà in modo che Dialogerediti il ​​tuo tema.
TheRealChx101

12

Prova getParent()sul luogo della discussione contextcome new AlertDialog.Builder(getParent());Spero che funzionerà, ha funzionato per me.


Perché usare getParent () ?, che cosa significa?
José Castro,

2
Quando si visualizza una finestra di dialogo in un'altra classe che non estende la classe Activity, è possibile che non si ottenga il contesto di quella classe che estende l'attività. Quindi, per ottenere il contesto all'interno della classe in cui si sta tentando di mostrare la finestra di dialogo ma non estendere l'attività, è possibile utilizzare getParent () che restituisce il contesto di tale attività superiore.
Priyank Joshi

1
Grazie @PriyankJoshi, mi hai salvato la giornata, risolve anche la strana eccezione di "Android Impossibile aggiungere la finestra non è valida; la tua attività è in corso?".
Eslam Yousef Mohammed,

Come potrei usare getParent ()?
Vinidog,

Grazie! Ha funzionato nel mio caso. Stavo chiamando this.parent.getActivity().getApplicationContext()ma ha this.parent.getActivity()fatto il trucco.
carlodonz,

3

Suppongo che stai cercando di creare una finestra di dialogo usando.

 getApplicationContext()
 mContext which is passed by activity.

se si visualizza la finestra di dialogo non classe di attività, è necessario passare l'attività come parametro.

Activity activity=YourActivity.this;

Ora funzionerà alla grande.

Se trovi qualche problema, fammelo sapere.


2

Ho provato con questo nel campo di contesto:

this.getActivity().getParent()

e funziona bene per me. Questo proveniva da una classe che si estende da "Frammento":

public class filtro extends Fragment{...

2

Salve, se si utilizza l'adattatore potrebbe esserci una possibilità.
Tutto quello che devi sapere quando hai usato qualsiasi finestra di dialogo in adapter, getContext (), contesto o attività non funzionerà qualche volta.

Ecco il trucco che ho usato v.getRootView().getContext() dove v è l'oggetto vista a cui fai riferimento.
Per esempio.


            @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

Grazie ! per avermi salvato il tempo prezioso !! (^_^)
Nice umang

1

Ho avuto la stessa eccezione. quello che faccio per risolvere questo problema è passare l'istanza della finestra di dialogo come parametro in funzione e usarla invece di passare solo al contesto, quindi usando getContext (). questa soluzione risolve il mio problema, spero che possa aiutare


0

Ho ottenuto questa eccezione, quando ho cercato di aprire la finestra di dialogo Progresso sotto il plug-in Cordova utilizzando due casi seguenti,

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

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

Più tardi è cambiato in questo modo,

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

Funziona bene per me.


0

Usa questo e il contesto non ha funzionato per me..ma MyActivityName.questo ha funzionato. Spero che questo aiuti chiunque ne abbia bisogno.


0

Ho risolto questo errore aggiungendo sotto l'autorizzazione dell'utente in AndroidManifest.xml

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

Inoltre, inizializza la finestra di dialogo Avviso con Nome attività:

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

Per maggiori dettagli, visita ==> Come creare la finestra di avviso in Android

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.