Al hacer clic en las URL se abre el navegador predeterminado

209

He cargado una URL externa en mi WebView. Ahora, lo que necesito es que cuando el usuario hace clic en los enlaces de la página cargada, tiene que funcionar como un navegador normal y abrir el enlace en el mismo WebView. ¿Pero está abriendo el navegador predeterminado y cargando la página allí?

He habilitado JavaScript. Pero aún así no está funcionando. ¿He olvidado algo?

JaVadid
fuente

Respuestas:

353

Si está utilizando un WebView, deberá interceptar los clics usted mismo si no desea el comportamiento predeterminado de Android.

Puede monitorear eventos en a WebViewusando a WebViewClient. El método que quieres es shouldOverrideUrlLoading(). Esto le permite realizar su propia acción cuando se selecciona una URL particular.

Establece el WebViewClientde su WebViewuso del setWebViewClient()método .

Si observa la WebViewmuestra en el SDK, hay un ejemplo que hace exactamente lo que desea. Es tan simple como:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}
Dave Webb
fuente
97
Parece que este es el comportamiento predeterminado WebViewClienty no necesita subclases si esto es todo lo que está haciendo. Conseguí que esto funcionara solo haciendomyWebView.setWebViewClient(new WebViewClient());
Adam
77
@ dave-webb, actualice la muestra para no llamar a loadUrl. Todos los que lean esto, no repliquen el código (devuelva false desde la devolución de llamada en lugar de llamar a view.loadUrl). Llamar a loadUrl introduce un error sutil en el que si tiene un iframe dentro de la página con una URL de esquema personalizado (por ejemplo, <iframe src = "tel: 123" />) navegará el marco principal de su aplicación a esa URL que probablemente rompa la aplicación como Un efecto secundario.
marcin.kosiba
1
@Adam ++, sí, también me di cuenta de esto: no podía entender por qué una de mis vistas web NO estaba usando el navegador del sistema, y ​​fue porque le había agregado un nuevo cliente web que solo anulaba OTRO método. Eso me llevó un tiempo depurar.
Peter Ajtai
¿Podemos implementar algo como: onLongClick, abrir enlaces en un navegador externo?
TheOnlyAnil
54

en algunos casos, es posible que necesite anular onLoadResource si obtiene una redirección que no activa el método de carga de URL. en este caso probé lo siguiente:

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}
realgt
fuente
¡Esto es genial! Me ahorró muchas horas tratando de averiguar cómo reproducir un archivo MP3 desde un enlace en una vista web. Muchas gracias de verdad!
Brigante
25

La documentación oficial dice que, haga clic en un enlace en un WebView iniciará la aplicación que maneja las URL. Debe anular este comportamiento predeterminado

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

o si no hay una lógica condicional en el método, simplemente haga esto

myWebView.setWebViewClient(new WebViewClient());
abbas
fuente
15

Agregue estas 2 líneas en su código:

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());
Confundir
fuente
9

El método boolean shouldOverrideUrlLoading(WebView view, String url)quedó en desuso en la API 24. Si admite nuevos dispositivos, debe usarlos boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

Puede usar ambos haciendo algo como esto:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return true;
        }
    });
} else {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
}
Chris Stillwell
fuente
6

La respuesta de Arulx Z fue exactamente lo que estaba buscando.

Estoy escribiendo una aplicación con Navigation Drawer con vista de reciclaje y vistas web, para mantener la navegación web dentro de la aplicación, independientemente de los hipervínculos en los que se haga clic (por lo tanto, no se inicia el navegador web externo). Para eso será suficiente poner las siguientes 2 líneas de código:

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

exactamente debajo de su declaración de WebView.

Aquí hay un ejemplo de mi código WebView implementado:

public class WebView1 extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
    wv.setWebViewClient(new WebViewClient());    //the lines of code added
    wv.setWebChromeClient(new WebChromeClient()); //same as above

    wv.loadUrl("http://www.google.com");
}}

de esta manera, cada enlace que se haga clic en el sitio web se cargará dentro de su WebView. (Usando Android Studio 1.2.2 con todos los SDK actualizados)

Samuele Bolognini
fuente