Clicar em URLs abre o navegador padrão

209

Carreguei um URL externo no meu WebView. Agora, o que eu preciso é que, quando o usuário clicar nos links da página carregada, ele funcione como um navegador normal e abra o link da mesma forma WebView. Mas está abrindo o navegador padrão e carregando a página lá?

Eu ativei o JavaScript. Mas ainda não está funcionando. Eu esqueci alguma coisa?

JaVadid
fonte

Respostas:

353

Se você estiver usando um, WebViewprecisará interceptar os cliques se não quiser o comportamento padrão do Android.

Você pode monitorar eventos WebViewusando a WebViewClient. O método que você deseja é shouldOverrideUrlLoading(). Isso permite que você execute sua própria ação quando um URL específico é selecionado.

Você define o WebViewClientde sua WebViewusando o setWebViewClient()método .

Se você observar a WebViewamostra 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;
    }
}
Dave Webb
fonte
97
Parece que esse é o comportamento padrão WebViewCliente não precisa de subclassificação se é tudo o que você está fazendo. Eu tenho esse ao trabalho apenas fazendomyWebView.setWebViewClient(new WebViewClient());
Adam
7
@ dave-webb, atualize a amostra para não chamar loadUrl. Todo mundo lendo isso - por favor, não replique o código (retorne false do retorno de chamada em vez de chamar view.loadUrl). A chamada de loadUrl introduz um bug sutil, se você tiver algum iframe na página com um URL de esquema personalizado (por exemplo, <iframe src = "tel: 123" />), ele navegará no quadro principal do seu aplicativo para esse URL, provavelmente quebrando o aplicativo como um efeito colateral.
Marcin.kosiba
1
@ Adam ++ - sim, notei isso também - eu não conseguia entender por que uma das minhas visualizações da web NÃO estava usando o navegador do sistema, e foi porque eu adicionei um novo cliente da web que estava substituindo outro método. Demorei um pouco para depurar.
Peter Ajtai
Podemos implementar algo como: onLongClick, abrir links em um navegador externo?
TheOnlyAnil
54

em alguns casos, pode ser necessário substituir o onLoadResource se você receber um redirecionamento que não aciona 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);
    }           
}
realgt
fonte
Isso é ótimo! Economizei muitas horas tentando descobrir como reproduzir um arquivo MP3 a partir de um link em uma visualização na web. Muito obrigado realgt!
Brigante
25

A documentação oficial diz que, clique em um link em um WebView para iniciar um 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, faça isso simplesmente

myWebView.setWebViewClient(new WebViewClient());
abbas
fonte
15

Adicione estas 2 linhas no seu código -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());
Confundir
fonte
9

O método boolean shouldOverrideUrlLoading(WebView view, String url)foi preterido na API 24. Se você estiver suportando novos dispositivos, deverá 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;
        }
    });
}
Chris Stillwell
fonte
6

A resposta de Arulx Z foi exatamente o que eu estava procurando.

Estou escrevendo um aplicativo com o Navigation Drawer com recyclerview e webviews, para manter a navegação na web dentro do aplicativo, independentemente dos hiperlinks clicados (portanto, não iniciando o navegador externo). Para isso, basta colocar as 2 linhas de código a seguir:

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

exatamente na sua declaração do WebView.

Aqui está um exemplo do meu código implementado no WebView:

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, todos os links clicados no site serão carregados no seu WebView. (Usando o Android Studio 1.2.2 com todos os SDKs atualizados)

Samuele Bolognini
fonte