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ü)

  • So fügen Sie WebRTC-Funktionalität in Android App hinzu
  • Was ist "zuverlässig schreiben" in BLE?
  • Laden von großen Bildern ohne OutOfMemoryError
  • Retrofit 2.0b2: Wie bekomme ich InputStream aus der Antwort?
  • Wird der Android-Anwendungskontext jemals zerstört?
  • Waben-Themen * .NoActionBar oder * .NoTitleBar - wo ist Menü-Taste?
  • 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.

  • Tödliches Signal 7 (SIGBUS) bei 0x00000000 (Code = 2)
  • Android Multidex, UnbefriedlichLinkError - konnte nicht gefunden werden. So Datei
  • Ist es möglich, Android Studio auf ChromeBook zu installieren?
  • JQuery Mobile + PhoneGap für Android - Fehler beim Laden von index.html
  • GL Wallpaper Beispiel zeigt nur grünen Bildschirm in Emulator, aber es funktioniert im Gerät
  • Libgdx - Wie kann man Hintergrundbild in der Bühne hinzufügen?
  • 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.