Facendo clic sugli URL si apre il browser predefinito


209

Ho caricato un URL esterno nel mio file WebView. Ora quello che mi serve è che quando l'utente fa clic sui collegamenti nella pagina caricata, deve funzionare come un normale browser e aprire il collegamento nello stesso WebView. Ma sta aprendo il browser predefinito e caricando la pagina lì?

Ho abilitato JavaScript. Ma ancora non funziona. Ho dimenticato qualcosa?

Risposte:


353

Se stai usando un, WebViewdovrai intercettare i clic da solo se non vuoi il comportamento Android predefinito.

Puoi monitorare gli eventi in WebViewun file WebViewClient. Il metodo che vuoi è shouldOverrideUrlLoading(). Ciò consente di eseguire la propria azione quando viene selezionato un URL particolare.

Hai impostato il WebViewClienttuo WebViewusando il setWebViewClient()metodo .

Se guardi l' WebViewesempio nell'SDK, c'è un esempio che fa proprio quello che vuoi. È semplice come:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

97
Sembra che questo sia il comportamento predefinito per WebViewCliente non necessita di sottoclassi se questo è tutto ciò che stai facendo. L'ho fatto funzionare solo facendomyWebView.setWebViewClient(new WebViewClient());
Adam

7
@ dave-webb per favore aggiorna il campione per non chiamare loadUrl. Tutti coloro che leggono questo messaggio: non replicare il codice (restituire false dalla richiamata invece di chiamare view.loadUrl). La chiamata a loadUrl introduce un bug sottile in cui se hai un iframe all'interno della pagina con un URL di schema personalizzato (ad esempio <iframe src = "tel: 123" />), navigherà nel frame principale della tua app a quell'URL molto probabilmente interrompendo l'app come un effetto collaterale.
marcin.kosiba

1
@Adam ++ - sì, l'ho notato anche io - non riuscivo a capire perché una delle mie visualizzazioni web NON stesse usando il browser di sistema, ed era perché avevo aggiunto un nuovo webclient ad esso che sovrascriveva solo UN ALTRO metodo. Mi ci è voluto un po 'per eseguire il debug.
Peter Ajtai

Possiamo implementare qualcosa come: onLongClick, collegamenti aperti in un browser esterno?
TheOnlyAnil

54

in alcuni casi potresti aver bisogno di un override di onLoadResource se ottieni un reindirizzamento che non attiva il metodo di caricamento dell'URL. in questo caso ho provato quanto segue:

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}

È fantastico! Mi ha risparmiato molte ore cercando di capire come riprodurre un file MP3 da un collegamento in una visualizzazione web. Grazie mille realgt!
Brigante

25

La documentazione ufficiale dice che fare clic su un collegamento in una visualizzazione Web avvierà un'applicazione che gestisce gli URL. È necessario sovrascrivere questo comportamento predefinito

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

oppure, se non esiste una logica condizionale nel metodo, farlo semplicemente

myWebView.setWebViewClient(new WebViewClient());

16

Aggiungi queste 2 righe nel tuo codice -

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

9

Il metodo è boolean shouldOverrideUrlLoading(WebView view, String url)stato deprecato nell'API 24. Se stai supportando nuovi dispositivi dovresti usare boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

Puoi usarli entrambi facendo qualcosa del genere:

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;
        }
    });
}

6

La risposta di Arulx Z era esattamente quello che stavo cercando.

Sto scrivendo un'app con Navigation Drawer con recyclerview e webviews, per mantenere la navigazione web all'interno dell'app indipendentemente dai collegamenti ipertestuali cliccati (quindi non avviare il browser web esterno). Per questo sarà sufficiente inserire le seguenti 2 righe di codice:

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

esattamente sotto la tua 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 nel sito verrà caricato nella tua WebView. (Utilizzo di Android Studio 1.2.2 con tutti gli SDK aggiornati)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.