Clicar em URLs abre o navegador padrão
-
24-09-2019 - |
Pergunta
Eu carreguei um URL externo no meu WebView
. Agora, o que eu preciso é que, quando o usuário clica nos links na página carregada, ele deve funcionar como um navegador normal e abrir o link no mesmo WebView
. Mas está abrindo o navegador padrão e carregando a página lá?
Eu habilitei o JavaScript. Mas ainda não está funcionando. Eu esqueci alguma coisa?
Solução
Se você está usando um WebView
Você terá que interceptar os cliques se não quiser o comportamento padrão do Android.
Você pode monitorar eventos em um WebView
usando um WebViewClient
. O método que você deseja é shouldOverrideUrlLoading()
. Isso permite que você execute sua própria ação quando um URL específico for selecionado.
Você define o WebViewClient
do seu WebView
usando o setWebViewClient()
método.
Se você olhar para o WebView
amostra no sdk Há um exemplo que faz exatamente o que você deseja. É tão simples quanto:
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
Outras dicas
Em alguns casos, você pode precisar de uma substituição do OnLoadResource se obtiver um redirecionamento que não acionar o método de carregamento de URL. Nesse caso, tentei o seguinte:
@Override
public void onLoadResource(WebView view, String url)
{
if (url.equals("http://redirectexample.com"))
{
//do your own thing here
}
else
{
super.onLoadResource(view, url);
}
}
Oficial documentação Diz, clique em um link em um Webview lançará o aplicativo que lida com URLs. Você precisa substituir esse comportamento padrão
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
ou se não houver lógica condicional no método, basta fazer isso
myWebView.setWebViewClient(new WebViewClient());
Adicione essas 2 linhas em seu código -
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
O método boolean shouldOverrideUrlLoading(WebView view, String url)
foi obsoleto na API 24. Se você está apoiando novos dispositivos, você deve usar boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)
.
Você pode usar os dois fazendo algo assim:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
newsItem.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
});
} else {
newsItem.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
}
A resposta de Arulx Z era exatamente o que eu estava procurando.
Estou escrevendo um aplicativo com a gaveta de navegação com RecyclerView e WebViews, para manter a navegação na web dentro do aplicativo, independentemente dos hiperlinks clicados (assim não iniciando o navegador externo). Para isso, basta colocar as duas linhas de código a seguir:
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
exatamente na sua instrução WebView.
Aqui está um exemplo do meu código WebView implementado:
public class WebView1 extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
wv.setWebViewClient(new WebViewClient()); //the lines of code added
wv.setWebChromeClient(new WebChromeClient()); //same as above
wv.loadUrl("http://www.google.com");
}}
Dessa forma, todo link clicado no site será carregado dentro do seu WebView. (Usando o Android Studio 1.2.2 com todos os SDK atualizados)