Durch Klicken auf URLs wird der Standardbrowser geöffnet

209

Ich habe eine externe URL in meine geladen WebView. Was ich jetzt brauche, ist, dass wenn der Benutzer auf die Links auf der geladenen Seite klickt, es wie ein normaler Browser funktionieren und den Link in demselben öffnen muss WebView. Aber es öffnet den Standardbrowser und lädt die Seite dort?

Ich habe JavaScript aktiviert. Aber es funktioniert immer noch nicht. Habe ich etwas vergessen

JaVadid
quelle

Antworten:

353

Wenn Sie ein verwenden, müssen WebViewSie die Klicks selbst abfangen, wenn Sie das Standardverhalten von Android nicht möchten.

Sie können Ereignisse in a WebViewmit a überwachen WebViewClient. Die gewünschte Methode ist shouldOverrideUrlLoading(). Auf diese Weise können Sie Ihre eigene Aktion ausführen, wenn eine bestimmte URL ausgewählt ist.

Sie legen die WebViewClientvon Ihnen WebViewmit der setWebViewClient()Methode fest .

Wenn Sie sich das WebViewBeispiel im SDK ansehen, gibt es ein Beispiel, das genau das tut, was Sie wollen. Es ist so einfach wie:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}
Dave Webb
quelle
97
Es sieht so aus, als ob dies das Standardverhalten für ist WebViewClientund keine Unterklassen erforderlich sind, wenn dies alles ist, was Sie tun. Ich habe das zum Laufen gebracht, indem ich es getan habemyWebView.setWebViewClient(new WebViewClient());
Adam
7
@ dave-webb Bitte aktualisieren Sie das Beispiel, um loadUrl nicht aufzurufen. Jeder, der dies liest - bitte replizieren Sie den Code nicht (geben Sie false vom Rückruf zurück, anstatt 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
1
@Adam ++ - ja, das ist mir auch aufgefallen - ich konnte nicht verstehen, warum eine meiner Webansichten NICHT den Systembrowser verwendete, und weil ich einen neuen Webclient hinzugefügt hatte, der nur eine andere Methode überschrieb. Das Debuggen hat eine Weile gedauert.
Peter Ajtai
Können wir so etwas implementieren wie: onLongClick, offene Links in einem externen Browser?
TheOnlyAnil
54

In einigen Fällen benötigen Sie möglicherweise eine Überschreibung von onLoadResource, wenn Sie eine Umleitung erhalten, die die URL-Lademethode nicht auslöst. In diesem Fall habe ich Folgendes versucht:

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}
realgt
quelle
Das ist toll! Ich habe mir viele Stunden Zeit gespart, um herauszufinden, wie eine MP3-Datei über einen Link in einer Webansicht abgespielt wird. Vielen Dank realgt!
Brigante
25

Laut offizieller Dokumentation wird durch Klicken auf einen Link in einer WebView eine Anwendung gestartet, die URLs verarbeitet. Sie müssen dieses Standardverhalten überschreiben

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

oder wenn die Methode keine bedingte Logik enthält, tun Sie dies einfach

myWebView.setWebViewClient(new WebViewClient());
abbas
quelle
15

Fügen Sie diese 2 Zeilen in Ihren Code ein -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());
Verwechseln
quelle
9

Die Methode boolean shouldOverrideUrlLoading(WebView view, String url)wurde in API 24 nicht mehr unterstützt. Wenn Sie neue Geräte unterstützen, sollten Sie diese verwenden boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

Sie können beides verwenden, indem Sie Folgendes tun:

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;
        }
    });
}
Chris Stillwell
quelle
6

Die Antwort von Arulx Z war genau das, wonach ich gesucht hatte.

Ich schreibe eine App mit Navigation Drawer mit Recyclerview und Webviews, damit das Surfen im Internet innerhalb der App bleibt, unabhängig davon, auf welche Hyperlinks geklickt wird (wodurch der externe Webbrowser nicht gestartet wird). Dafür reicht es aus, die folgenden 2 Codezeilen einzufügen:

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

genau unter Ihrer WebView-Anweisung.

Hier ist ein Beispiel für meinen implementierten WebView-Code:

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

Auf diese Weise wird jeder auf der Website angeklickte Link in Ihre WebView geladen. (Verwenden von Android Studio 1.2.2 mit allen aktualisierten SDKs)

Samuele Bolognini
quelle