2011-02-05 7 views
5

Tengo WebView en el que quiero abrir enlaces que pertenecen al dominio www.example.org en la vista web, mientras que todos los demás enlaces (si hace clic) se abren por el navegador predeterminado fuera de mi aplicación.¿Cómo hacer que los enlaces se abran en la vista web o se abra por navegador predeterminado según el nombre de dominio?

He intentado utilizar public boolean shouldOverrideUrlLoading (vista WebView, url String) pero no funciona correctamente.

Este es el código que no funciona:

public class MyWebViewClient extends WebViewClient { 
    @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        try { 
        URL urlObj = new URL(url); 
        if (urlObj.getHost().equals("192.168.1.34")) { 
         view.loadUrl(url); 
         return true; 
        } else { 
         view.loadUrl(url); 
         return false; 
        } 
        } catch (Exception e) { 

        } 
       } 
} 

En ambos casos (return true y volver falsa) de la URL es manejado por mi solicitud.

+1

Este código realmente le da ninguna pista de lo que los diferentes comportamientos son al devolver un valor booleano diferente porque se está llamando view.loadUrl() en ambos casos, lo que produce la mismo resultado. Si eliminaste esa línea de ambas declaraciones, verías que la devolución falsa aún carga la url en WebView ... y el retorno verdadero no hace nada (debes hacer algo manualmente). – Devunwired

Respuesta

22

Una vez que se crea y adjunta un WebViewClient a su WebView, que han anulado el comportamiento predeterminado donde Android permitirá que el ActivityManager pase a la URL en el explorador (esto sólo ocurre cuando ningún cliente se encuentra en la vista), ver the docs on the method for more .

Una vez que haya adjuntado una WebViewClient, volviendo forma falsa shouldOverrideUrlLoading() pasa la URL a la WebView, cuando regresaba verdadera cuenta la WebView no hacer nada ... porque su aplicación se hará cargo de ella. Desafortunadamente, ninguno de esos caminos lleva a que Android pase la URL al navegador. Algo como esto debería resolver el problema:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    try { 
     URL urlObj = new URL(url); 
     if(TextUtils.equals(urlObj.getHost(),"192.168.1.34")) { 
     //Allow the WebView in your application to do its thing 
     return false; 
     } else { 
     //Pass it to the system, doesn't match your domain 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setData(Uri.parse(url)); 
     startActivity(intent); 
     //Tell the WebView you took care of it. 
     return true; 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Sé que parece un poco contrario a la intuición como era de esperar return false; Para eludir por completo la WebView, pero este no es el caso, una vez que está utilizando una costumbre WebViewClient.

Espero que ayude!

+0

Gracias por el código, pero desafortunadamente esto tampoco funciona. Probé tu código, el navegador externo carga la url (www.example.org) tan pronto como comienzo la aplicación. – ace

+0

Eso suena más como un problema con la instrucción if que elige la ruta. He actualizado el ejemplo ahora que ha publicado el código usando la misma verificación if-else que usted (ambos estamos asumiendo que la declaración evalúa sus URL correctamente). – Devunwired

+0

Hola, todavía no funciona. De nuevo, el navegador externo maneja la url sin importar lo opuesto a mi código. Parece que Google Docs en este – ace

5

Si no puede molestarse en explicar lo que "no funciona correctamente" significa que no podemos molestarnos en brindarle mucha ayuda específica.

Use shouldOverrideUrlLoading(). Examine la URL proporcionada. Si es uno que desea conservar en el WebView, llame al loadUrl() en el WebView con la URL y devuelva true. De lo contrario, devuelve false y deja que Android lo maneje normalmente.

1

Añadir lo siguiente a su actividad

@Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       if(Uri.parse(url).getHost().endsWith("192.168.1.34")) { 
        view.loadUrl(url); 
        Log.d("URL => ", url); // load URL in webview 
        return false; 
       } 

       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       view.getContext().startActivity(intent); // Pass it to the system, doesn't match your domain 
       return true; 
      } 
Cuestiones relacionadas