Domanda

Non riesco a capire perché questo sta accadendo. Questo codice:

mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);

funziona bene. Tuttavia, questo codice:

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

getta la seguente eccezione:

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

Tutte le idee perché questo sta accadendo? Chiamo questo dal metodo onCreate.

È stato utile?

Soluzione

Quale versione stai usando API? Se ho ragione su ciò che il problema è allora questo è stato fissato in Android 1.6 (API versione 4).

Sembra che il riferimento all'oggetto che getApplicationContext() sta tornando solo punta a null. Penso che tu stai avendo un problema simile a quello che avevo in quella parte del codice nel onCreate() è in esecuzione prima che la finestra è in realtà fatto in fase di costruzione. Questo sarà un hack, ma provare ad avviare un nuovo thread in poche centinaia di millisecondi (IIRC: 300-400 sembrava funzionare per me, ma avrete bisogno di armeggiare) che apre il ProgressDialog e inizia a qualsiasi altra cosa avete bisogno ( es. rete IO). Qualcosa di simile a questo:

@Override
public void onCreate(Bundle savedInstanceState) {
    // do all your other stuff here

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            mProgressDialog = ProgressDialog.show(
               YouTube.this.getApplicationContext(), "",
               YouTube.this.getString(R.string.loading), true);

            // start time consuming background process here
        }
    }, 1000); // starting it in 1 second
}

Altri suggerimenti

Sto usando la versione Android 2.1 con API livello 7. Di fronte a questa (o simile) problema e risolto utilizzando questo:

Dialog dialog = new Dialog(this);

al posto di questo:

Dialog dialog = new Dialog(getApplicationContext());

Spero che questo aiuti:)

Per me ha funzionato cambiando

builder = new AlertDialog.Builder(getApplicationContext());

a

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

La cosa strana è che il primo può essere trovato in google tutorial e la gente ottiene l'errore su questo ..

Non credo che questo sia un problema di temporizzazione intorno a un contesto di applicazione nullo

Prova estendere Application all'interno della vostra app (o semplicemente utilizzarlo se hai già)

public class MyApp extends Application

Crea l'istanza disponibile come Singleton privato. Si tratta di mai nulla

private static MyApp appInstance;

Crea un aiutante statica in MyApp (che utilizzerà il Singleton)

    public static void showProgressDialog( CharSequence title, CharSequence message )
{
    prog = ProgressDialog.show(appInstance, title, message, true); // Never Do This!
}

BOOM !!

Inoltre, controlla la risposta di ingegnere Android qui: WindowManager $ BadTokenException

  

Una delle cause di questo errore può tentare di visualizzare un'applicazione   finestra / finestra di dialogo attraverso un contesto che non è un'attività.

Ora, sono d'accordo, ma non ha senso che il metodo prende un param contesto, invece di attività ..

Dopo aver letto le risposte di cui sopra ho scoperto che per la mia situazione i seguenti risolto il problema.

Questo ha gettato l'errore

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(getApplicationContext());
        dialog.show();              
    }
});

In base alle risposte precedenti che suggerivano il contesto era quello sbagliato, ho cambiato il getApplicationContext () per recuperare il contesto dal View passata ai pulsanti metodo onClick.

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(v.getContext());
        dialog.show();              
    }
});

Non capisco pienamente il funzionamento di Java in modo potrei sbagliarmi, ma credo che per la mia situazione specifica la causa avrebbe potuto essere legato al fatto che il frammento di cui sopra è stato definito in una classe di attività astratta; ereditato e utilizzato da molte attività, forse che ha contribuito al fatto che getApplicationContext () non restituisce un contesto valida ?? (Solo una supposizione).

Sto creando un guarda la mappa con sovrapposizioni dettagliate. Stavo creando il mio itemizedoverlay come questo dal mio mapActivity:

OCItemizedOverlay currentLocationOverlay = new OCItemizedOverlay(pin,getApplicationContext);

ho scoperto che avrei ricevuto il "android.view.WindowManager $ BadTokenException: Impossibile aggiungere finestra - nulla pedina non è per un'applicazione" eccezione quando il metodo onTap di mio itemizedoverlay è stata innescata (quando la posizione è sfruttato sul mapview ).

ho scoperto che se ho passato semplicemente, 'questo' invece di 'getApplicationContext ()' al mio costruttore, il problema è andato via. Questo sembra sostenere la conclusione di alienjazzcat. strano.

Per le attività indicate nel TabActivities usare getParent ()

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

anziché

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

Per Android 2.2
Utilizzare questo codice:

//activity is an instance of a class which extends android.app.Activity
Dialog dialog = new Dialog(activity);

al posto di questo codice:

// this code produces an ERROR:
//android.view.WindowManager$BadTokenException: 
//Unable to add window -- token null is not for an application
Context mContext = activity.getApplicationContext();
Dialog dialog = new Dialog(mContext);

Nota:. La mia finestra di dialogo personalizzata viene creata al di fuori metodo activity.onCreateDialog(int dialogId)

Prova -

AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

avuto un problema simile con (compatibilità) Frammenti in cui si utilizza un getActivity() all'interno ProgressDialog.show() si blocca. Ero d'accordo che è a causa della tempistica.

Una possibile soluzione:

mContext = getApplicationContext();

if (mContext != null) {
    mProgressDialog = ProgressDialog.show(mContext, "", getString(R.string.loading), true);
}

invece di usare

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

Posizionare il mContext il più presto possibile per dare più tempo per afferrare il contesto. Non c'è ancora alcuna garanzia che questo lavoro, si riduce solo la probabilità di un incidente. Se ancora non funziona, si avrebbe dovuto ricorrere al trucco timer (che può causare altri problemi di temporizzazione come chiudere la finestra di seguito).

Naturalmente, se è possibile utilizzare this o ActivityName.this, è più stabile perché this punta già a qualcosa. Ma in alcuni casi, come con alcune architetture Fragment, non è un'opzione.

(Per i riferimenti futuri)

Credo che sia perché non c'è differenze di contesto di applicazione e contesto di attività, come spiegato qui: http: //www.doubleencore.com/2013/06/context/

Il che significa che non possiamo mostrare finestra utilizzando contesto di applicazione. Questo è tutto.

Per usare le finestre di dialogo all'interno attività, fare in questo modo:

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     mContext = this;

     //using mContext here refering to activity context
     mBuilder = new AlertDialog.Builder(mContext);
     //...
     //rest of the code
     //...
}

Per usare le finestre di dialogo all'interno frammenti, fare in questo modo:

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View mRootView = inflater.inflate(R.layout.fragment_layout, container, false);
      mContext = getActivity();

      //using mContext here refering to fragment's hosting activity context
      mBuilder = new AlertDialog.Builder(mContext);
      //...
      //rest of the code
      //...
      return mRootView;
}

Questo è tutto ^ _ ^

Quello che ho fatto per aggirare questo è stato quello di creare una classe di base per tutte le mie attività in cui ho memorizzare i dati globali. Nella prima attività, ho salvato il contesto in una variabile nella mia classe di base in questo modo:

Classe Base

public static Context myucontext; 

Per prima attività derivata dalla classe base

mycontext = this

Poi uso myContext invece di getApplicationContext durante la creazione di finestre di dialogo.

AlertDialog alertDialog = new AlertDialog.Builder(mycontext).create();

Se stai chiamando ProgressDialog.show () in un frammento, gettando il mContext di attività ha lavorato per me.

     ProgressDialog pd = new ProgressDialog((Activity) mContext);

Ho implementato Avviso di dialogo per gettare eccezioni al activitty corrente view.Whenever avevo dato come questo

AlertDialog.Builder builder = new AlertDialog.Builder(context);

Dato stesso codice di scrittura Finestra Exception.I all'avviso di onCreate (). Così semplice che ho usato context = this; dopo la dichiarazione setContentView() nella variabile onCreate() method.Taken contesto come globale come Context context;

Esempio di codice è

static Context context;

 public void onCreate(Bundle savedInstanceState)  { 
        super.onCreate(savedInstanceState); 


        setContentView(R.layout.network); 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        context = this;
.......

metodo di avviso campione è

private void alertException(String execMsg){
        Log.i(TAG,"in alertException()..."+context);
        Log.e(TAG,"Exception :"+execMsg);
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
.......

Funziona bene per me.Actually ho cercato per questo errore su StackOverflow ho trovato questo query.After leggere tutte le risposte di questo post, ho provato in questo modo in modo che funziona .Ho pensato che questa è una soluzione semplice per superare l'eccezione.

Grazie, Rajendar

se hai un problema su groupActivity non lo uso questo. GENITORE è una statica dal ActivityGroup Parent.

final AlertDialog.Builder builder = new AlertDialog.Builder(GroupActivityParent.PARENT);

anziché

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

Una finestra di dialogo viene sempre creato e visualizzato come parte di un'attività. È necessario passare in un contesto di attività al posto del contesto applicativo.

http://developer.android.com/guide/topics/ ui / dialogs.html # ShowingADialog

Questo è un problema comune. Utilizzare this invece di getApplicationContext() Questo dovrebbe risolvere il problema

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top