2009-10-13 24 views
7

Tengo algunos widgets WebView dentro de mi Activity. Yo uso loadData() para establecer el contenido, y este html contiene un enlace. Algunos de mis WebViews funcionan bien, cuando hago clic en el enlace, el navegador web se inicia en una nueva ventana, pero algunos hacen que mi aplicación se cuelgue cuando hago clic en un enlace.Android WebView se cuelga al hacer clic en un enlace

10-13 08:45:24.257: ERROR/AndroidRuntime(751): Uncaught handler: thread main exiting due to uncaught exception 
10-13 08:45:24.308: ERROR/AndroidRuntime(751): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at android.app.ApplicationContext.startActivity(ApplicationContext.java:627) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at android.content.ContextWrapper.startActivity(ContextWrapper.java:236) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:185) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:277) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at android.os.Looper.loop(Looper.java:123) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at android.app.ActivityThread.main(ActivityThread.java:3948) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at java.lang.reflect.Method.invoke(Method.java:521) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 
10-13 08:45:24.308: ERROR/AndroidRuntime(751):  at dalvik.system.NativeStart.main(Native Method) 

Parece que hay un problema con el que los IntentWebView incendios cuando hago clic en la URL, pero no tengo el control de esta Intent, creo.

¿Alguien tiene alguna idea?

Yo uso este AsyncTask para establecer el contenido en el WebView, y funciona bien:

public class SetAdTask extends AsyncTask<Void, Void, String>{ 

    private Main main; 
    private WebView webView; 

    public SetAdTask(Main main, WebView webView){ 
     this.main = main; 
     this.webView = webView; 
    } 

    protected void onPreExecute() { 
     Main.Log("onPreExecute()");     
    } 

    protected String doInBackground(Void... params) { 
     Main.Log("doInBackground()");     
     return main.getRestClient().getAdCode(); 
    } 

    protected void onPostExecute(String result) { 
     Main.Log("onPostExecute()"); 

     String html = "<html><head><title>ad</title></head><body>"; 
     html += "<div style=\"color:grey;font-size:12px;\">ADVERTISEMENT<br/>"; 
     html += result; 
     html += "</body></html>"; 
     webView.loadData(html, "text/html", "latin-1"); 
    } 

} 
+0

Oh, encontré el problema .. He iniciado la vista web con contexto incorrecto ... utilicé viewView = new WebView (main.getApplicationContext()) ... Parece que la vista web se muestra bien, con este contexto, pero no puede manejar los intentos correctamente ... T –

+1

Puede responder a su propia pregunta, ya sabes. –

Respuesta

27

El problema fue que mi webview fue inicializado con el contexto equivocado ...

i utilizado:

WebView w = new WebView(this.getApplicationContext())

la que se estrella ...

la correcta context es la misma activity

WebView w = new WebView(this)

+0

+1 Tuve exactamente el mismo problema, esto lo resolvió, gracias! –

+0

¡Eso lo hizo, muchas gracias! Aunque este problema solo apareció en ciertos dispositivos. Oh, bueno, ahora funciona para todos. – Tom

+0

Tuve el mismo problema pero con enlaces clicables dentro de elementos 'ListView'. Esto lo solucionó; ¡gracias! – jokeefe

9

Si no desea utilizar una actividad como su contexto, otra solución (sorprendente) a este problema es la creación de un vacío para la WebViewClientWebView:

webView.setWebViewClient(new WebViewClient()); 

parece un fallo Android: de acuerdo con el API puede usar un objeto de contexto para inicializar una vista web (pero esto puede causar el fallo que usted ha mencionado).

+3

¡Si pudiera votarte 100 veces más, lo haría! WebView con el contexto de la aplicación es una capacidad crucial para mantener el estado interno de WebView en los cambios de orientación. Gran hallazgo – Kevin

Cuestiones relacionadas