¿Cuál es la diferencia entre setWebViewClient y setWebChromeClient?

Respuestas:

148

Del código fuente :

// Instance of WebViewClient that is the client callback.
private volatile WebViewClient mWebViewClient;
// Instance of WebChromeClient for handling all chrome functions.
private volatile WebChromeClient mWebChromeClient;

// SOME OTHER SUTFFF.......

/**
 * Set the WebViewClient.
 * @param client An implementation of WebViewClient.
 */
public void setWebViewClient(WebViewClient client) {
    mWebViewClient = client;
}

/**
 * Set the WebChromeClient.
 * @param client An implementation of WebChromeClient.
 */
public void setWebChromeClient(WebChromeClient client) {
    mWebChromeClient = client;
}

El uso de WebChromeClient le permite manejar cuadros de diálogo, favicons, títulos y el progreso de Javascript. Eche un vistazo a este ejemplo: Agregar soporte de alert () a un WebView

A primera vista, hay demasiadas diferencias WebViewClient y WebChromeClient . Pero, básicamente: si está desarrollando un WebView que no requerirá demasiadas funciones sino que representará HTML, puede usar a WebViewClient. Por otro lado, si desea (por ejemplo) cargar el favicon de la página que está representando, debe usar un WebChromeClientobjeto y anular el onReceivedIcon(WebView view, Bitmap icon).

La mayoría de las veces, si no quieres preocuparte por esas cosas ... puedes hacer esto:

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

Y su WebView tendrá (en teoría) todas las características implementadas (como el navegador nativo de Android).

Cristian
fuente
26
De esta forma, la respuesta no está completa. ChromeClient permite manejar las cosas enumeradas, pero ¿qué es ViewClient y cuáles son las similitudes y diferencias?
Pentium10
3
¿Este método ayudará a mejorar algunas características pobres de la vista web predeterminada? especialmente para animaciones y transiciones css3?
Ata Iravani
1
¿Puedo usar ambos a la vez?
Sergey Dirin
1
@SergeyDirin: stackoverflow.com/a/6475858 . Consulte esta respuesta, puede usar ambos a la vez.
hoangtu23
¿Cómo manejar el permiso para la cámara en webviewclient si no tiene Chrome?
j2emanue
100

Siento que esta pregunta necesita un poco más de detalles. Mi respuesta está inspirada en la Programación de Android, The Nerd Ranch Guide (2nd edition).

Por defecto , JavaScript está desactivado en WebView. No siempre es necesario tenerlo activado, pero para algunas aplicaciones, es posible que lo requiera.

La carga de la URL debe hacerse después de configurar WebView, por lo que debe hacer eso al final. Antes de eso, active JavaScript llamando getSettings()para obtener una instancia de WebSettings y llamando WebSettings.setJavaScriptEnabled(true). WebSettings es la primera de las tres formas en que puede modificar su WebView. Tiene varias propiedades que puede establecer, como la cadena del agente de usuario y el tamaño del texto.

Después de eso, configura su WebViewClient. WebViewClient es una interfaz de eventos. Al proporcionar su propia implementación de WebViewClient, puede responder a los eventos de representación. Por ejemplo, podría detectar cuándo el renderizador comienza a cargar una imagen desde una URL particular o decidir si vuelve a enviar una solicitud POST al servidor.

WebViewClient tiene muchos métodos que puede anular, la mayoría de los cuales no tratará. Sin embargo, debe reemplazar la implementación predeterminada de WebViewClient de shouldOverrideUrlLoading(WebView, String). Este método determina qué sucederá cuando se cargue una nueva URL en WebView, como presionando un enlace. Si devuelve verdadero, está diciendo: "No maneje esta URL, la estoy manejando yo mismo". Si devuelve falso, está diciendo: "Continúe y cargue esta URL, WebView, no estoy haciendo nada con ella".

La implementación predeterminada dispara una intención implícita con la URL, tal como lo hizo anteriormente. Ahora, sin embargo, este sería un problema grave. Lo primero que hacen algunas aplicaciones web es redirigirlo a la versión móvil del sitio web. Con el WebViewClient predeterminado, eso significa que se le envía de inmediato al navegador web predeterminado del usuario. Esto es justo lo que estás tratando de evitar. La solución es simple: simplemente anule la implementación predeterminada y devuelva false.

Use WebChromeClient para arreglar las cosas. Ya que se está tomando el tiempo para crear su propio WebView, arreglemos un poco agregando una barra de progreso y actualizando los subtítulos de la barra de herramientas con el título de la página cargada.

Para conectar ProgressBar, usará la segunda devolución de llamada en WebView: WebChromeClient .

WebViewClient es una interfaz para responder a eventos de representación; WebChromeClient es una interfaz de eventos para reaccionar a eventos que deberían cambiar elementos de Chrome alrededor del navegador. Esto incluye alertas de JavaScript, favicons y, por supuesto, actualizaciones para cargar el progreso y el título de la página actual.

Conéctalo onCreateView(…). Uso de WebChromeClient para arreglar las cosas Las actualizaciones de progreso y las actualizaciones de títulos tienen su propio método de devolución de llamada, onProgressChanged(WebView, int)y onReceivedTitle(WebView, String). El progreso que recibe onProgressChanged(WebView, int)es un número entero de 0 a 100. Si es 100, sabe que la página se está cargando, por lo que oculta la barra de progreso configurando su visibilidad en View.GONE.

Descargo de responsabilidad: esta información fue tomada de la Programación de Android: la guía Big Nerd Ranch con permiso de los autores. Para obtener más información sobre este libro o para comprar una copia, visite bignerdranch.com.

maytham-ɯɐɥʇʎɐɯ
fuente
11
Creo que esta es una mejor respuesta que la aceptada.
redbeam_