2012-04-10 9 views
5

Sto utilizzando una visualizzazione Web nella mia applicazione. Webview viene creato utilizzando il contesto dell'applicazione. App si blocca su clic su qualsiasi casella di selezioneArresto anomalo dell'app quando si fa clic sulla casella di selezione nella vista web

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) 

Sono ben consapevole che questo problema è stato fatto già molte volte, ma io sono ancora trovare qualsiasi soluzione di lavoro. Questo problema verrà risolto se utilizzo il contesto dell'attività ma devo usare il contesto dell'applicazione a causa di altri problemi. Per altri avvisi e finestre di dialogo li ho gestiti ignorando onJsAlert() in webchromeclient, ma non sono in grado di scoprire come posso intercettarlo nella mia webview e creare la mia finestra di selezione.

Qualsiasi tipo di suggerimento/aiuto è molto apprezzato.

Aggiunta di un campione fittizio della mia realizzazione WebView

class MyWebView extends WebView 
{ 

MyWebView(Context context) 
{ 

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

cosa hai tenuto in sospeso è Activity o WebView? – Bhavin

+0

la sua webview. Viene richiamato da un'attività diversa. Sto creando una webview in fase di runtime (non sto usando alcun layout per questo) utilizzando il contesto dell'applicazione – androgeek

+0

se sei a conoscenza di tale situazione, quindi devi utilizzare il contesto Attività piuttosto che Applicazione, poiché stai provando per fare alcune cose dell'interfaccia utente senza il contesto dell'interfaccia utente che dovrebbe essere di attività. –

risposta

0

vorrei poter utilizzare extends Activity in tal caso.

basta prendere un riferimento da here.

E se si desidera utilizzare WebView in aggiunta a questo, ho scritto il seguente codice per quello.

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

Grazie per il vostro supporto, ma il problema è che sto creando la mia webview per una libreria che può essere utilizzata da diverse attività applicative, quindi questo è l'approccio che devo seguire in ogni caso – androgeek

3

Questo perché si passa il contesto dell'applicazione anziché un contesto di attività quando si crea il WebView. Per mostrare una casella di selezione in Android da WebView, la WebView utilizza il contesto fornito nel suo costruttore e apre un selettore a scelta singola nativa. Per mostrare questa finestra di dialogo selettore, ha bisogno di un contesto di attività e non di un'applicazione. Modificare la riga:

super(context.getApplicationContext()); 

Con questa formazione:

super(context); 

È inoltre necessario assicurarsi di utilizzare la visualizzazione Web nell'attività da cui è stato creato (non ha senso a usarlo su una diversa attività). Se hai bisogno della vista Web in un'attività diversa, creane una solo utilizzando il contesto dell'attività designata.

Problemi correlati