Frage

Ich kann nicht zu begreifen scheinen, warum dies geschieht. Dieser Code:

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

funktioniert gut. Doch dieser Code:

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

wirft die folgende Ausnahme:

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

Irgendwelche Ideen, warum dies geschieht? Ich bin dieses aus dem onCreate Methode aufrufen.

War es hilfreich?

Lösung

Welche API-Version verwenden Sie? Wenn ich mich recht zu wissen, was das Problem ist dann dieser in Android wurde behoben 1.6 (API Version 4).

Es sieht aus wie die Objektreferenz, dass getApplicationContext() nur Punkte auf null zurückkehrt. Ich glaube, Sie haben ein ähnliches Problem wie man ich in hatte, dass einige der Code in der onCreate() ausgeführt wird, bevor das Fenster tatsächlich gebaut getan wird. Das wird ein Hack sein, versuchen Sie aber einen neuen Thread in wenigen hundert Millisekunden starten (IIRC: 300-400, für mich zu arbeiten schien, aber Sie werden zu basteln müssen), dass Ihre ProgressDialog öffnet und beginnt alles, was man benötigt ( z. B. Netzwerk-IO). So etwas wie folgt aus:

@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
}

Andere Tipps

Ich bin mit Android-Version 2.1 mit API-Ebene 7. ich damit konfrontiert (oder ähnlichem) Problem und gelöst, indem Sie diese:

Dialog dialog = new Dialog(this);

anstelle dieses:

Dialog dialog = new Dialog(getApplicationContext());

Hope, das hilft:)

für mich gearbeitet zu ändern

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

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

Schräge Sache ist, dass die erste in Google Tutorial gefunden werden kann und die Leute bekommen Fehler auf diesem ..

Ich glaube nicht, das ist ein Timing-Problem um einen Null-Anwendungskontext

Versuchen Anwendung in Ihrer App erstreckt (oder es nur verwenden, wenn Sie bereits haben)

public class MyApp extends Application

Machen Sie die Instanz als private Singleton zur Verfügung. Dies ist nie null

private static MyApp appInstance;

Erstellen Sie einen statischen Helfer in MeineAnw (die die Singleton verwenden)

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

BOOM !!

Auch, ob die Antwort von android Ingenieure hier: Window $ BadTokenException

  

Eine Ursache für diesen Fehler kann eine Anwendung angezeigt werden versuchen,   Fenster / Dialog über einen Kontext, der keine Aktivität ist.

Nun, ich stimme, ist es nicht sinnvoll ist, dass das Verfahren einen Kontext param nimmt, statt Aktivität ..

die oben genannten Antworten lesen Nachdem ich das für meine Situation fand das das Problem behoben folgen.

Dieser wirft er den Fehler

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

Auf der Grundlage der bisherigen Antworten, die den Kontext vorgeschlagen war die falsche, änderte ich den getApplicationContext (), um den Kontext abgerufen werden von der Ansicht geführt, in dem Verfahren, onClick Tasten.

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

Das verstehe ich nicht vollständig die Funktionsweise von Java, damit ich könnte falsch sein, aber ich glaube, dass die Ursache für meine spezifische Situation mit der Tatsache verbunden worden sein, dass der obige Schnipsel in einer abstrakten Aktivitätsklasse definiert wurde; geerbt und von vielen Aktivitäten verwendet wird, vielleicht, dass dazu beigetragen, dass getApplicationContext () gibt einen gültigen Kontext nicht zurück ?? (Nur eine Vermutung).

Ich schaffe eine Kartenansicht mit aufgeschlüsselt Overlays. Ich war die Schaffung meiner itemizedoverlay wie dies aus meiner mapActivity:

OCItemizedOverlay currentLocationOverlay = new OCItemizedOverlay(pin,getApplicationContext);

fand ich, dass ich das bekommen würde „android.view.WindowManager $ BadTokenException: Nicht imstande, Fenster hinzuzufügen - Token null ist nicht für eine Anwendung“ Ausnahme, wenn mein itemizedoverlay des onTap Methode ausgelöst wurde (wenn die Lage auf dem mapview abgegriffen ).

Ich fand, dass, wenn ich einfach übergeben, ‚das‘ anstelle von ‚getApplicationContext ()‘ zu meinem Konstruktor, das Problem ging weg. Dies scheint darauf hinzu Unterstützung alienjazzcat Schlussfolgerung. seltsam.

Für Aktivitäten innerhalb TabActivities gezeigt verwenden getParent ()

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

statt

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

Für Android 2.2
Verwenden Sie diesen Code:

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

anstelle dieser Code:

// 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);

Bemerkung: Mein benutzerdefinierter Dialog außerhalb activity.onCreateDialog(int dialogId) Methode erstellt

.

Versuchen -

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

Sie hat ein ähnliches Problem mit (Kompatibilität) Fragmente, bei denen unter Verwendung eines getActivity() innerhalb ProgressDialog.show() stürzt. Ich würde zustimmen, dass es wegen des Timings ist.

Eine mögliche Lösung:

mContext = getApplicationContext();

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

anstelle von

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

Setzen Sie den mContext so früh wie möglich es mehr Zeit zu geben, um den Kontext zu greifen. Es gibt noch keine Garantie, dass dies funktionieren wird, es reduziert nur die Wahrscheinlichkeit eines Absturzes. Wenn es immer noch nicht funktioniert, dann würden Sie müssen die Timer-Hack greifen (die später andere Timing-Probleme wie den Dialog Entlassung führen kann).

Natürlich, wenn Sie this oder ActivityName.this verwenden können, ist es stabiler, da this schon zeigt auf etwas. Aber in einigen Fällen, wie bei bestimmtem Fragmente Architekturen, es ist keine Option.

(Für zukünftige Referenzen)

Ich denke, es ist, weil es Unterschiede in dem Anwendungskontext und Aktivität Kontext, wie hier erklärt: http: //www.doubleencore.com/2013/06/context/

Was bedeutet, dass wir nicht Anwendungskontext mit Show-Dialog können. Das ist es.

Für Dialoge innerhalb Aktivitäten verwenden, tut es so aus:

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
     //...
}

Für Dialoge innerhalb Fragmente verwenden, tut es so aus:

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;
}

Das ist es ^ _ ^

Was ich getan habe, dies zu umgehen war eine Basisklasse für alle meine Aktivitäten zu schaffen, wo ich globale Daten speichern. In der ersten Aktivität, sparte ich den Kontext, in einer Variablen in meiner Basisklasse wie folgt:

Basisklasse

public static Context myucontext; 

Erste Aktivität abgeleitet von der Basisklasse

mycontext = this

Dann benutze ich mycontext statt getApplicationContext wenn Dialoge zu schaffen.

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

Wenn Sie anrufen ProgressDialog.show () in einem Fragment, das Gießen der mContext zu Aktivität für mich gearbeitet.

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

Ich habe Alert-Dialog zur Ausnahme umgesetzt wirft auf das aktuelle activitty view.Whenever Ich hatte wie diese gegeben

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

Im selben Fenster Exception.I Schreib Code für Alarm aus onCreate (). So einfach habe ich context = this; nach setContentView() Anweisung in onCreate() method.Taken Kontextvariable als globale Gegeben wie Context context;

Codebeispiel ist

static Context context;

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


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

        context = this;
.......

Alert-Methode Probe ist

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

Es funktioniert gut für me.Actually ich für diesen Fehler auf Stackoverflow ich gesucht fanden diese query.After alle Antworten von diesem Post zu lesen, ich auf diese Weise versucht, so dass es funktioniert .Ich dachte, das eine einfache Lösung ist die Ausnahme für überwinden.

Danke, Rajendar

Wenn Sie ein Problem auf groupActivity nicht haben diese verwenden. ELTERN ist eine statische aus dem Elternteil Activity.

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

statt

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

Ein Dialog wird immer erstellt und als Teil einer Aktivität angezeigt. Sie müssen in einem Aktivitätskontext Kontext statt der Anwendung zu übergeben.

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

Dies ist ein häufiges Problem. Verwenden this statt getApplicationContext() Das sollte Ihr Problem

lösen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top