2012-04-10 13 views
5

Używam widoku internetowego w mojej aplikacji. Webview jest tworzony przy użyciu kontekstu aplikacji. Aplikacja awarii na kliknięciu dowolnego wybierz poleAwaria aplikacji po kliknięciu pola wyboru w widoku strony internetowej

04-10 14:19:14.502: E/AndroidRuntime(12628): Uncaught handler: thread main exiting due to uncaught exception 
04-10 14:19:14.542: E/AndroidRuntime(12628): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.view.ViewRoot.setView(ViewRoot.java:476) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.app.Dialog.show(Dialog.java:239) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.webkit.WebView$InvokeListBox.run(WebView.java:9509) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.os.Handler.handleCallback(Handler.java:609) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.os.Looper.loop(Looper.java:123) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.app.ActivityThread.main(ActivityThread.java:4595) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at java.lang.reflect.Method.invokeNative(Native Method) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at java.lang.reflect.Method.invoke(Method.java:521) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-10 14:19:14.542: E/AndroidRuntime(12628): at dalvik.system.NativeStart.main(Native Method) 

Zdaję sobie sprawę, że to pytanie zostało zadane już wiele razy, ale jestem jeszcze znaleźć żadnego rozwiązania roboczą. Ten problem zostanie rozwiązany, jeśli użyję kontekstu działania, ale muszę użyć kontekstu aplikacji z powodu innych problemów. W przypadku innych alertów i okien dialogowych obsłużyłem je przez przesłonięcie opcji JsAlert() w webchromeclient, ale nie jestem w stanie znaleźć sposobu, w jaki mogę przechwycić to w moim widoku internetowym i utworzyć własne okno dialogowe selektora.

Wszelkie sugestie/pomoc są mile widziane.

Dodawanie obojętne próbkę mojego Webview realizacji

class MyWebView extends WebView 
{ 

MyWebView(Context context) 
{ 

    super(context.getApplicationContext()); 
    setWebChromeClient(myWebChromeClient); 
    setWebViewClient(myWebViewClient); 
} 
} 
+0

co trzymasz w rozszerzeniach to Aktywność czy WebView? – Bhavin

+0

jego widok internetowy. Jest wywoływana z innej czynności. Tworzę widok w przeglądarce w czasie wykonywania (nie używam dla niego żadnego układu), używając kontekstu aplikacji – androgeek

+0

, jeśli wiesz o takiej sytuacji, musisz użyć kontekstu działania zamiast aplikacji, ponieważ próbujesz robić rzeczy z UI bez kontekstu UI, który powinien być z Aktywności. –

Odpowiedz

0

chciałbym do korzystania extends Activity w takim przypadku.

wystarczy wziąć odniesienie od here.

A jeśli oprócz tego chcesz używać webView, mam do tego napisać następujący kod.

mWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedError(WebView view, int errorCode, 
       String description, String failingUrl) { 
      // Handle the error 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 
    }); 
+0

Dziękuję za wsparcie, ale problem polega na tym, że tworzę mój webview dla biblioteki, która może być używana przez różne aplikacje, więc to jest podejście, które muszę przestrzegać w każdym przypadku – androgeek

3

Dzieje się tak dlatego, że podczas tworzenia WebView przekazuje się kontekst aplikacji zamiast kontekstu działania. Aby pokazać pole wyboru na Androidzie z WebView, WebView używa kontekstu nadanego mu w jego konstruktorze i otwiera natywny wybór pojedynczego wyboru. Aby wyświetlić to okno dialogowe selektora, potrzebuje kontekstu działania, a nie aplikacji. Zmień linię:

super(context.getApplicationContext()); 

Z tej linii:

super(context); 

Należy również upewnić się, użyj widoku internetowego w działalności, z której został utworzony (nie ma sensu go używać na innej działalności). Jeśli potrzebujesz widoku sieci w innej aktywności, po prostu utwórz go w kontekście wyznaczonego działania.

Powiązane problemy