Facendo clic su URL apre il browser predefinito
-
24-09-2019 - |
Domanda
Ho caricato un URL esterno nel mio WebView
. Ora quello che mi serve è che quando l'utente fa clic sul link sulla pagina caricata, si deve lavorare come un normale browser e aprire il link nella stessa WebView
. Ma è l'apertura del browser predefinito e il caricamento della pagina c'è?
Ho abilitato JavaScript. Ma ancora non funziona. Ho dimenticato qualcosa?
Soluzione
Se stai usando un WebView
dovrete intercettare gli scatti da soli se non si desidera che il comportamento di default di Android.
È possibile monitorare gli eventi in un WebView
utilizzando un WebViewClient
. Il metodo che si desidera è shouldOverrideUrlLoading()
. Questo consente di eseguire la propria azione quando viene selezionato un particolare URL.
È impostare il WebViewClient
del vostro WebView
utilizzando il metodo setWebViewClient()
.
Se si guarda alla WebView
campione nel SDK c'è un esempio che fa proprio quello che vuoi. E 'semplice come:
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
Altri suggerimenti
In alcuni casi potrebbe essere necessario un override di onLoadResource se si ottiene un reindirizzamento che non innesca il metodo URL di caricamento. in questo caso ho provato il seguente:
@Override
public void onLoadResource(WebView view, String url)
{
if (url.equals("http://redirectexample.com"))
{
//do your own thing here
}
else
{
super.onLoadResource(view, url);
}
}
documentazione dice, cliccare su un link in una WebView sarà applicazione di lancio che gestisce gli URL. È necessario ignorare questo comportamento predefinito
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
o se non v'è alcuna logica condizionale nel metodo semplicemente fare questo
myWebView.setWebViewClient(new WebViewClient());
Aggiungi questo 2 righe nel codice -
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
Il metodo boolean shouldOverrideUrlLoading(WebView view, String url)
è sconsigliata a API 24. Se si supportano nuovi dispositivi si dovrebbe usare boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)
.
È possibile utilizzare sia facendo qualcosa di simile a questo:
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;
}
});
}
La risposta di Arulx Z era esattamente quello che stavo cercando.
Sto scrivendo un app con navigazione Cassetto con recyclerview e visualizzazioni, per mantenere la navigazione web all'interno della app, indipendentemente di collegamenti ipertestuali cliccato (quindi non il lancio del browser web esterno). Per questo è sufficiente inserire i seguenti 2 righe di codice:
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
esattamente sotto la sua dichiarazione WebView.
Ecco un esempio del mio codice WebView implementato:
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");
}}
in questo modo, ogni link cliccato sul sito verrà caricato all'interno del vostro WebView. (Utilizzo di Android 1.2.2 Studio con tutto lo SDK aggiornato)