Android WebView, wie man Weiterleitungen in der App behandelt, anstatt einen Browser zu öffnen


120

In meiner App wird die URL, auf die ich zugreife, derzeit umgeleitet. In diesem Fall öffnet WebView einen neuen Browser, anstatt in meiner App zu bleiben. Gibt es eine Möglichkeit, die Einstellungen so zu ändern, dass die Ansicht wie gewohnt zur URL umgeleitet wird, aber in meiner App bleibt, anstatt einen neuen Browser zu öffnen?

Bearbeiten:

Ich möchte die Umleitungs-URL, ich weiß nur nicht, wie ich sie erstellen soll. Der einzige Weg, um zu dieser URL zu gelangen, ist eine, die eine Umleitung zu der gewünschten URL bewirkt.

Beispiel: Wenn Sie hierher gehen: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 Beachten Sie, wie die URL zum tatsächlichen Produkt umgeleitet wird. Wenn ich es in meiner App in einem neuen Browser öffne, funktioniert dies einwandfrei. Wenn ich es jedoch mit einer WebView in meiner App behalte, wird es so angezeigt, als würde nach k = 9780735622777 gesucht: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . ODER es öffnet die Ansicht im Browser und zeigt an, was angemessen ist. Ich möchte jedoch alles in meiner App behalten.

Antworten:


253

Erstellen Sie einen WebViewClient und überschreiben Sie die Methode 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
Ich liebe Antworten, die wie method () sind {//
füge

19
Bitte replizieren Sie den obigen Code nicht. Geben Sie false vom Rückruf zurück, anstatt stattdessen view.loadUrl aufzurufen. Das Aufrufen von loadUrl führt zu einem subtilen Fehler, bei dem ein Iframe auf der Seite mit einer benutzerdefinierten Schema-URL (z. B. <iframe src = "tel: 123" />) im Hauptframe Ihrer App zu dieser URL navigiert, die die App höchstwahrscheinlich als beschädigt ein Nebeneffekt.
marcin.kosiba

@ marcin.kosiba hängt davon ab, wie es verwendet wird, für meinen Anwendungsfall ist das, was Sie beschreiben, kein Problem, aber ich schätze immer noch die Heads-Ups :)
Warpzit

@Warpzit - sicher, wenn Sie nur vertrauenswürdige Inhalte in die Webansicht laden und eine 100% ige Garantie haben, dass niemand diesen Fehler ausnutzen kann. OTOH warum das Risiko eingehen?
marcin.kosiba

1
Wie kann ich wissen, dass die URL, die in shouldOverrideUrlLoadingmethod aufgerufen wird, die nächste Weiterleitungs-URL ist? Und ich will es zulassen?
Phan Sinh

21

Nach Angaben des Beamten Dokumentation wird durch Klicken auf einen Link in WebView eine Anwendung gestartet, die URLs verarbeitet. Dies ist standardmäßig ein Browser. Sie müssen das Standardverhalten wie folgt überschreiben

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

8
Noch besser ist es, myWebView.setWebViewClient (neuer WebViewClient ()) aufzurufen. Die Standardimplementierung von shouldOverrideUrlLoading gibt false zurück.
Cyroxis

14

Das Hinzufügen eines Standardbenutzers reicht aus WebViewClient. Dadurch verarbeitet WebView alle geladenen URLs selbst.

mWebView.setWebViewClient(new WebViewClient());

8

Sie müssen festlegen, dass Ihr benutzerdefinierter WebviewClient die Methode shouldOverrideUrlLoading für Ihre Webansicht überschreibt, bevor Sie die URL laden.

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

Überprüfen Sie den Beispielcode für die Verarbeitung von Weiterleitungs-URLs und öffnen Sie PDF-Dateien ohne Download in der Webansicht. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


Beachten Sie, dass der obige Link für einen Beispielcode nicht vorhanden ist.
Jetdog

Ich habe den Link hochgeladen.
Ashish Das

Arbeitete für mich Danke @AshishDas +10
Livemaker

2

Bitte verwenden Sie den folgenden Kotlin-Code

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

Für weitere Informationen klicken Sie hier


2

Erstellen Sie eine Klasse, die den Webviewclient implementiert, und fügen Sie den folgenden Code hinzu, mit dem die URL-Zeichenfolge wie unten gezeigt überschrieben werden kann. Sie können diese [Beispiel] [1] sehen

public class myWebClient extends WebViewClient {

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

Erstellen Sie auf Ihrem Konstruktor ein Webview-Objekt wie unten gezeigt.

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

Fügen Sie dann den folgenden Code hinzu, um das Laden von URLs in Ihre App durchzuführen

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

Hallo Willkommen, möchten Sie Ihren Code erklären und uns zeigen, warum dies die richtige Antwort ist?
Ali
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.