studio setwebchromeclient onshowfilechooser example android webviewclient webchromeclient

setwebchromeclient - webviewclient android



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

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


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

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

La carga de la URL se debe realizar después de configurar la vista web, de modo que haga lo último. Antes de eso, getSettings() 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 de agente de usuario y el tamaño del texto.

Después de eso, configuras tu 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 si decide 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 devuelve verdadero, está diciendo: "No maneje esta URL, lo estoy manejando yo mismo". Si devuelve falso, está diciendo: "Adelante, cargue esta URL, WebView, no estoy haciendo nada con eso". . ”

La implementación predeterminada dispara una intención implícita con la URL, como lo hizo anteriormente. Ahora, sin embargo, esto 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 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 propia WebView, reparémoslo 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 el ProgressBar, utilizará 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 ante eventos que deberían cambiar elementos de Chrome en el navegador. Esto incluye alertas de JavaScript, favicons y, por supuesto, actualizaciones para el progreso de carga y el título de la página actual.

onCreateView(…) en onCreateView(…) . Usando WebChromeClient para arreglar las cosas Las actualizaciones de Progress 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 de onProgressChanged(WebView, int) es un número entero de 0 a 100. Si es 100, sabe que la página se ha cargado, por lo que oculta la View.GONE progreso configurando su visibilidad en View.GONE .

Descargo de responsabilidad: esta información se tomó de la programación de Android: The Big Nerd Ranch Guide con el permiso de los autores. Para obtener más información sobre este libro o para comprar una copia, visite bignerdranch.com.


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, favicons, títulos y el progreso de Javascript. Eche un vistazo a este ejemplo: Agregar soporte de alerta () a un WebView

A primera vista, hay demasiadas diferencias WebViewClient & WebChromeClient . Pero, básicamente, si está desarrollando una WebView que no requerirá demasiadas funciones pero que represente HTML, solo puede utilizar un WebViewClient . Por otro lado, si desea (por ejemplo) cargar el favicon 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 funciones implementadas (como el navegador nativo de Android).