Qual é a diferença entre setWebViewClient e setWebChromeClient?

243

Qual é a diferença entre setWebViewClientvs. setWebChromeClientno Android?

Pentium10
fonte
Eu adicionei mais informações
Cristian

Respostas:

148

Do código fonte :

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

O uso do WebChromeClient permite que você lide com diálogos, favicons, títulos e o progresso de Javascript. Veja este exemplo: Adicionando suporte a alert () a um WebView

À primeira vista, há muitas diferenças entre o WebViewClient e o WebChromeClient . Mas, basicamente: se você estiver desenvolvendo um WebView que não exija muitos recursos, mas renderize HTML, basta usar a WebViewClient. Por outro lado, se você deseja (por exemplo) carregar o ícone favorito da página que está renderizando, use um WebChromeClientobjeto e substitua-o onReceivedIcon(WebView view, Bitmap icon).

Na maioria das vezes, se você não quiser se preocupar com essas coisas ... basta fazer o seguinte:

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

E seu WebView (em teoria) terá todos os recursos implementados (como o navegador nativo do Android).

Cristian
fonte
26
Neste formulário, a resposta não está completa. O ChromeClient permite lidar com as coisas enumeradas, mas o que é o ViewClient e quais são as semelhanças e diferenças?
Pentium10
3
Esse método ajudará a melhorar alguns recursos ruins da visualização na web padrão? especialmente para animações e transições de CSS3?
Ata Iravani
1
Posso usar os dois de uma vez?
Sergey Dirin
1
@SergeyDirin: stackoverflow.com/a/6475858 . Consulte esta resposta, você pode usar os dois ao mesmo tempo.
precisa saber é o seguinte
Como lidar com a permissão para a câmera no webviewclient se não tiver o chrome?
J2emanue 01/09
100

Sinto que esta pergunta precisa de mais detalhes. Minha resposta é inspirada na Programação para Android, The Nerd Ranch Guide (2ª edição).

Por padrão , o JavaScript está desativado no WebView. Você nem sempre precisa ativá-lo, mas para alguns aplicativos, pode ser necessário.

O carregamento do URL deve ser feito após a configuração do WebView, para que você faça isso por último. Antes disso, você getSettings()ativa o JavaScript chamando para obter uma instância do WebSettings e chamando WebSettings.setJavaScriptEnabled(true). WebSettings é a primeira das três maneiras pelas quais você pode modificar seu WebView. Possui várias propriedades que você pode definir, como a sequência do agente do usuário e o tamanho do texto.

Depois disso, você configura seu WebViewClient. WebViewClient é uma interface de eventos. Ao fornecer sua própria implementação do WebViewClient, você pode responder à renderização de eventos. Por exemplo, você pode detectar quando o renderizador começa a carregar uma imagem de um URL específico ou decidir se deve reenviar uma solicitação POST ao servidor.

O WebViewClient possui muitos métodos que você pode substituir, a maioria dos quais não será tratada . No entanto, você precisa substituir a implementação padrão do WebViewClient shouldOverrideUrlLoading(WebView, String). Este método determina o que acontecerá quando um novo URL for carregado no WebView, como pressionar um link. Se você retornar true, estará dizendo: "Não manipule este URL, eu mesmo estou manipulando". Se você retornar falso, estará dizendo: "Vá em frente e carregue este URL, WebView, não estou fazendo nada com ele".

A implementação padrão dispara uma intenção implícita com a URL, assim como você fez anteriormente. Agora, porém, isso seria um problema grave. A primeira coisa que alguns aplicativos da Web fazem é redirecioná-lo para a versão móvel do site. Com o WebViewClient padrão, isso significa que você é enviado imediatamente para o navegador da web padrão do usuário. É exatamente isso que você está tentando evitar. A correção é simples - basta substituir a implementação padrão e retornar false.

Use o WebChromeClient para aprimorar as coisas Como você está criando um tempo para criar seu próprio WebView, vamos aprimorá-lo um pouco adicionando uma barra de progresso e atualizando a legenda da barra de ferramentas com o título da página carregada.

Para ligar o ProgressBar, você usará a segunda chamada de retorno no WebView: WebChromeClient.

WebViewClient é uma interface para responder à renderização de eventos; O WebChromeClient é uma interface de eventos para reagir a eventos que devem alterar elementos do chrome no navegador. Isso inclui alertas JavaScript, ícones favoritos e, é claro, atualizações para carregar o progresso e o título da página atual.

Ligue-o onCreateView(…). Usando o WebChromeClient para aprimorar as atualizações de progresso e atualizações de títulos, cada um tem seu próprio método de retorno de chamada onProgressChanged(WebView, int)e onReceivedTitle(WebView, String). O progresso do qual você recebe onProgressChanged(WebView, int)é um número inteiro de 0 a 100. Se for 100, você sabe que a página terminou de carregar, para ocultar a ProgressBar configurando sua visibilidade para View.GONE.

Exoneração de responsabilidade: Estas informações foram obtidas de Android Programming: The Big Nerd Ranch Guide com permissão dos autores. Para mais informações sobre este livro ou para comprar uma cópia, visite bignerdranch.com.

maytham-ɯɐɥʇʎɐɯ
fonte
11
Eu acho que essa é uma resposta melhor que a aceita.
Redbeam_ # 9/18