Qual é a diferença entre setWebViewClient
vs. setWebChromeClient
no Android?
android
webviewclient
webchromeclient
Pentium10
fonte
fonte
Respostas:
Do código fonte :
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 umWebChromeClient
objeto e substitua-oonReceivedIcon(WebView view, Bitmap icon)
.Na maioria das vezes, se você não quiser se preocupar com essas coisas ... basta fazer o seguinte:
E seu WebView (em teoria) terá todos os recursos implementados (como o navegador nativo do Android).
fonte
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 chamandoWebSettings.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 chamadaonProgressChanged(WebView, int)
eonReceivedTitle(WebView, String)
. O progresso do qual você recebeonProgressChanged(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 paraView.GONE
.fonte