¿Cuál es la diferencia entre setWebViewClient vs. setWebChromeClient?

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

Desde el 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 diálogos, favicones, títulos y el progreso de JavaScript. Eche un vistazo a este ejemplo: Agregar soporte de alerta () a una WebView

A primera vista, existen demasiadas diferencias entre WebViewClient y WebChromeClient . Pero, básicamente, si está desarrollando un WebView que no requiere demasiadas funciones sino que representa HTML, puede simplemente usar un WebViewClient . Por otro lado, si desea (por ejemplo) cargar el icono de la página que está representando, debe usar un objeto WebChromeClient 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).

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

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

La carga de la URL debe hacerse después de configurar WebView, de modo que lo haga al final. Antes de eso, active JavaScript llamando a getSettings() para obtener una instancia de WebSettings y llamando a 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 evento. Al proporcionar su propia implementación de WebViewClient, puede responder a eventos de representación. Por ejemplo, puede detectar cuándo el procesador comienza a cargar una imagen desde una URL determinada o si debe volver 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 al presionar un enlace. Si responde la verdad, está diciendo: “No maneje esta URL, la manejo yo mismo”. Si devuelve falso, está diciendo: “Continúe y cargue esta URL, WebView, no estoy haciendo nada con eso”. ”

La implementación predeterminada desencadena un bash implícito 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 WebViewClient predeterminado, eso significa que se lo envía inmediatamente 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 falso.

Use WebChromeClient para arreglar las cosas Ya que se está tomando el tiempo para crear su propio WebView, vamos a arreglarlo 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 callback en WebView: WebChromeClient .

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

onCreateView(…) en onCreateView(…) . Uso de WebChromeClient para mejorar las actualizaciones de progreso y títulos cada uno tiene su propio método de callback, onProgressChanged(WebView, int) y onReceivedTitle(WebView, String) . El progreso que recibe de onProgressChanged(WebView, int) es un número entero de 0 a 100. Si es 100, sabe que la página está View.GONE , por lo que oculta la View.GONE progreso estableciendo su visibilidad en View.GONE .

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