Qual è la differenza tra setWebViewClient e setWebChromeClient?


Risposte:


148

Dal codice sorgente :

// 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;
}

L'utilizzo di WebChromeClient consente di gestire finestre di dialogo, favicon, titoli e progressi JavaScript. Dai un'occhiata a questo esempio: aggiunta del supporto alert () a un WebView

A prima vista, ci sono troppe differenze tra WebViewClient e WebChromeClient . Ma in sostanza: se stai sviluppando un WebView che non richiede troppe funzionalità ma che esegue il rendering HTML, puoi semplicemente usare a WebViewClient. D'altra parte, se si desidera (ad esempio) caricare la favicon della pagina che si sta visualizzando, è necessario utilizzare un WebChromeClientoggetto e sovrascrivere il file onReceivedIcon(WebView view, Bitmap icon).

Il più delle volte, se non vuoi preoccuparti di quelle cose ... puoi semplicemente fare questo:

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

E il tuo WebView avrà (in teoria) tutte le funzionalità implementate (come il browser nativo Android).


26
In questo modulo, la risposta non è completa. ChromeClient consente di gestire le cose elencate, ma cos'è ViewClient e quali sono le somiglianze e le differenze?
Pentium10

3
Questo metodo contribuirà a migliorare alcune funzionalità scadenti della visualizzazione Web predefinita? soprattutto per animazioni e transizioni css3?
Ata Iravani,

1
Posso usarli entrambi contemporaneamente?
Sergey Dirin,

1
@SergeyDirin: stackoverflow.com/a/6475858 . Fai riferimento a questa risposta, puoi usarli entrambi contemporaneamente.
hoangtu23,

Come gestire i permessi per la telecamera in Webviewclient se non hanno Chrome?
j2emanue,

100

Sento che questa domanda necessita di maggiori dettagli. La mia risposta è ispirata alla Programmazione Android, The Nerd Ranch Guide (2a edizione).

Per impostazione predefinita , JavaScript è disattivato in WebView. Non è sempre necessario averlo attivato, ma per alcune app potrebbe essere necessario.

Il caricamento dell'URL deve essere eseguito dopo aver configurato WebView, quindi è necessario farlo per ultimo. Prima di ciò, si attiva JavaScript chiamando getSettings()per ottenere un'istanza di WebSettings e chiamando WebSettings.setJavaScriptEnabled(true). WebSettings è il primo dei tre modi in cui è possibile modificare WebView. Ha varie proprietà che puoi impostare, come la stringa dell'agente utente e la dimensione del testo.

Successivamente, configura WebViewClient. WebViewClient è un'interfaccia di evento. Fornendo la propria implementazione di WebViewClient, è possibile rispondere agli eventi di rendering. Ad esempio, è possibile rilevare quando il renderer inizia a caricare un'immagine da un determinato URL o decidere se inviare nuovamente una richiesta POST al server.

WebViewClient ha molti metodi che è possibile ignorare, molti dei quali non verranno trattati. Tuttavia, è necessario sostituire l'implementazione predefinita di WebViewClient shouldOverrideUrlLoading(WebView, String). Questo metodo determina cosa accadrà quando un nuovo URL viene caricato in WebView, come premendo un collegamento. Se ritorni vero, stai dicendo: "Non gestire questo URL, lo sto gestendo da solo." Se restituisci false, stai dicendo: "Vai avanti e carica questo URL, WebView, non sto facendo nulla con esso."

L'implementazione predefinita genera un intento implicito con l'URL, proprio come hai fatto in precedenza. Ora, però, questo sarebbe un grave problema. La prima cosa che alcune applicazioni Web fanno è reindirizzare alla versione mobile del sito Web. Con WebViewClient predefinito, ciò significa che si viene immediatamente inviati al browser Web predefinito dell'utente. Questo è proprio quello che stai cercando di evitare. La correzione è semplice: basta sostituire l'implementazione predefinita e restituire false.

Usa WebChromeClient per abbellire le cose Dal momento che stai prendendo il tempo per creare il tuo WebView personale, abbelliamolo un po 'aggiungendo una barra di avanzamento e aggiornando i sottotitoli della barra degli strumenti con il titolo della pagina caricata.

Per collegare il ProgressBar, si utilizzerà la seconda richiamata su WebView: WebChromeClient.

WebViewClient è un'interfaccia per rispondere agli eventi di rendering; WebChromeClient è un'interfaccia di eventi per reagire agli eventi che dovrebbero cambiare elementi di Chrome attorno al browser. Ciò include avvisi JavaScript, favicon e, naturalmente, aggiornamenti per l'avanzamento del caricamento e il titolo della pagina corrente.

Collegalo onCreateView(…). Utilizzando WebChromeClient per abbellire le cose Gli aggiornamenti di avanzamento e di titolo hanno ciascuno il proprio metodo di richiamata onProgressChanged(WebView, int)e onReceivedTitle(WebView, String). L'avanzamento che ricevi onProgressChanged(WebView, int)è un numero intero compreso tra 0 e 100. Se è 100, sai che la pagina è stata caricata, quindi nascondi ProgressBar impostando la sua visibilità su View.GONE.

Disclaimer: queste informazioni sono state tratte da Programmazione Android: The Big Nerd Ranch Guide con il permesso degli autori. Per ulteriori informazioni su questo libro o per acquistarne una copia, visitare bignerdranch.com.


11
Penso che questa sia una risposta migliore di quella accettata.
redbeam_
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.