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?

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top