Android WebView, come gestire i reindirizzamenti nell'app invece di aprire un browser


120

Quindi in questo momento nella mia app l'URL a cui sto accedendo ha un reindirizzamento e quando ciò accade il WebView aprirà un nuovo browser, invece di rimanere nella mia app. Esiste un modo per modificare le impostazioni in modo che la vista reindirizzi all'URL come al solito, ma rimanga nella mia app invece di aprire un nuovo browser?

Modificare:

Voglio l'URL di reindirizzamento, semplicemente non so come crearlo, quindi l'unico modo per arrivare a quell'URL è attraverso uno che causerà un reindirizzamento a quello che voglio.

Ad esempio: quando vai qui: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 nota come reindirizzerà l'URL al prodotto reale. Nella mia app, se lo apro in un nuovo browser, lo farà benissimo, tuttavia se lo tengo nella mia app con un WebView, verrà visualizzato come se stesse cercando k = 9780735622777, in questo modo: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . OPPURE, aprirà la vista nel browser e mostrerà ciò che è appropriato. Tuttavia, voglio mantenere tutto nella mia app.

Risposte:


253

Creare un WebViewClient e sovrascrivere il metodo shouldOverrideUrlLoading .

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        view.loadUrl(url);
        return false; // then it is not handled by default action
   }
});

8
Adoro le risposte che sono come method () {// inserisci qui il codice che non sai come usare}
JMRboosties

19
Si prega di non replicare il codice sopra. Restituisce 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

@ marcin.kosiba dipende da come viene utilizzato, per il mio caso d'uso ciò che descrivi non è un problema ma apprezzo comunque il
preavviso

@ Warpzit - certo, se carichi solo contenuti attendibili nella visualizzazione web e hai la garanzia al 100% che nessuno possa sfruttare quel problema tecnico, va bene. OTOH perché correre il rischio?
marcin.kosiba

1
Come posso sapere che l'URL richiamato nel shouldOverrideUrlLoadingmetodo è l'URL di reindirizzamento successivo? E voglio permetterlo?
Phan Sinh

21

Secondo la documentazione ufficiale , un clic su qualsiasi collegamento in WebView avvia un'applicazione che gestisce gli URL, che per impostazione predefinita è un browser. È necessario sovrascrivere il comportamento predefinito in questo modo

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

8
Ancora meglio è sufficiente chiamare myWebView.setWebViewClient (new WebViewClient ()); L'implementazione predefinita di shouldOverrideUrlLoading restituisce false.
cyroxis

14

Basta aggiungere un'abitudine predefinita WebViewClient. Questo fa sì che WebView gestisca autonomamente gli URL caricati.

mWebView.setWebViewClient(new WebViewClient());

8

Dovrai impostare il tuo WebviewClient personalizzato che sostituisce il metodo shouldOverrideUrlLoading per la tua visualizzazione web prima di caricare l'URL.

mWebView.setWebViewClient(new WebViewClient()
        {
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url)
            {
                return shouldOverrideUrlLoading(url);
            }

            @TargetApi(Build.VERSION_CODES.N)
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
            {
                Uri uri = request.getUrl();
                return shouldOverrideUrlLoading(uri.toString());
            }

            private boolean shouldOverrideUrlLoading(final String url)
            {
                Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);

                // Here put your code

                return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
            }
        });

Controlla il codice di esempio per la gestione degli URL di reindirizzamento e apri PDF senza download, in webview. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


Nota che il collegamento sopra per un codice di esempio non esiste.
Jetdog

ho caricato il link.
Ashish Das

Ha funzionato per me Grazie @AshishDas +10
livemaker

2

Si prega di utilizzare il codice kotlin di seguito

webview.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {   
                view.loadUrl(url)
                return false 
            }
        })

Per maggiori info clicca qui


2

Crea una classe che implementa webviewclient e aggiungi il seguente codice che consente di ignorare la stringa dell'URL come mostrato di seguito. Puoi vedere questi [esempio] [1]

public class myWebClient extends WebViewClient {

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url); 
         return true;
     }
}

Sul tuo costruttore, crea un oggetto webview come mostrato di seguito.

   web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

Quindi aggiungi il seguente codice per eseguire il caricamento degli URL all'interno della tua app

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }

0
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    if (url.equals("your url")) {
        
            Intent intent = new Intent(view.getContext(), TransferAllDoneActivity.class);
            startActivity(intent);
        
    }
}

Ciao Benvenuto, vorresti spiegare il tuo codice e mostrarci perché è la risposta giusta?
Ali
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.