Android BadTokenException bei Verwendung eines WebView Containers

So folgte ich einem Beitrag zur Vermeidung von WebView-Speicherlecks, was darauf hindeutet, einen Webview-Container zu verwenden und dann programmgesteuert hinzufügen / entfernen Sie die Webansicht aus dem Container in Aktivitätscodes: Speicherleck in WebView

Allerdings habe ich den folgenden Absturz getroffen, wenn du auf ein HTML-Element klickst, das eine Liste der auszuwählenden Optionen anfordert (zB Datum / Monat Dropdown-Menü)

W/dalvikvm(17767): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) W/WindowManager(129): Attempted to add window with non-application token WindowToken{4094b730 token=null}. Aborting. FATAL EXCEPTION: main android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application android.view.ViewRoot.setView(ViewRoot.java:561) android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) android.app.Dialog.show(Dialog.java:265) android.webkit.WebView$InvokeListBox.run(WebView.java:9170) android.os.Handler.handleCallback(Handler.java:587) android.os.Handler.dispatchMessage(Handler.java:92) android.os.Looper.loop(Looper.java:150) android.app.ActivityThread.main(ActivityThread.java:4263) java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke(Method.java:507) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) dalvik.system.NativeStart.main(Native Method) 

Ich habe folgendes in meinem Layout:

 FrameLayout android:id="@+id/webview_container" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/titlebar"> /FrameLayout> 

Ich habe folgendes in onCreate ():

 mWebViewContainer = (FrameLayout)findViewById(R.id.webview_container); mWebView = new WebView(getApplicationContext()); mWebViewContainer.addView(mWebView); mWebView.setWebChromeClient(new WebChromeClient()); 

Ich habe auch einen WebViewClient gesetzt.

Ich habe überprüft, dass mWebView.getWindowToken () einen Nicht-Nullwert zurückgibt.

Irgendwelche Ideen, warum dieses Problem passieren könnte?

Bearbeiten: Ich habe noch mehr experimentiert und mich umgesehen, aber dieses Problem noch nicht gelöst. Alles funktioniert gut, wenn ich das Webview direkt in das Layout selbst stecke. Aber das will ich nicht, weil ich in der Lage bin, dynamisch zu wechseln.

  • Flash in Android WebView - Wie kann ich den Vollbildschirm automatisch einstellen?
  • OnPageFinished () nie aufgerufen (webview)!
  • Android WebView HTML5 Video Spawns MediaPlayer, der für immer auf Samsung S4 lebt
  • Wie man ein Javascript-Skript in einem Webview vor der HTML-Belastung in Android 7 injizieren
  • Android-Webview-Cookie gibt null zurück
  • Manchmal wirft Uncaught Error: Fehler beim Aufrufen von Methode auf NPObject auf Android
  • Wie man POST-Daten mit Code in einer Android-Webview sendet
  • So aktivieren Sie Cookies in android webview?
  • 2 Solutions collect form web for “Android BadTokenException bei Verwendung eines WebView Containers”

    Wenn Sie das WebView erstellen, verwenden Sie derzeit den Kontext der Anwendung. Sie sollten den Kontext der Aktivität verwenden. Um das Problem zu lösen, ersetzen Sie getApplicationContext() mit this wenn Sie das WebView erstellen.

    Das Problem ist hier:

      mWebView.setWebChromeClient(new WebChromeClient()); 

    Nachdem Sie die Aktivität verlassen haben, gibt es Chancen, dass einige Rückrufe in WebChromeClient versuchen, Dialoge zu öffnen, während die Containeraktivität zerstört wurde.
    Hier ist eine Lösung, die für mich arbeitet, füge einfach mWebView.destroy () in deiner Aktivität onDestroy ()

      @Override public void onDestroy() { super.onDestroy(); if (mWebView != null) mWebView.destroy(); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.