URL'leri tıkladığınızda varsayılan tarayıcı açılır


209

Adresime harici bir URL yükledim WebView. Şimdi ihtiyacım olan şey, kullanıcı yüklenen sayfadaki bağlantıları tıklattığında, normal bir tarayıcı gibi çalışması ve bağlantıyı aynı şekilde açması gerektiğidir WebView. Ancak varsayılan tarayıcıyı açıyor ve sayfayı oraya mı yüklüyor?

JavaScript'i etkinleştirdim. Ama yine de çalışmıyor. Bir şey mi unuttum?

Yanıtlar:


353

WebViewVarsayılan Android davranışını istemiyorsanız, bir tıklama kullanıyorsanız , tıklamaları kendiniz kesmeniz gerekir.

Bir olayları izleyebilir WebViewkullanarak a WebViewClient. İstediğiniz yöntem shouldOverrideUrlLoading(). Bu, belirli bir URL seçildiğinde kendi eyleminizi gerçekleştirmenizi sağlar.

Sen ayarlamak WebViewClientsenin içinde WebViewkullanarak setWebViewClient()yöntemini .

SDK'daki WebViewörneğe bakarsanız, tam olarak istediğinizi yapan bir örnek vardır. Bu kadar basit:

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

97
Görünüşe göre bu, varsayılan davranıştır WebViewClientve yaptığınız tek şeyse alt sınıflamaya gerek yoktur. Ben sadece bunu yaparak çalışmak için varmyWebView.setWebViewClient(new WebViewClient());
Adam

7
@ dave-webb Lütfen loadUrl öğesini çağırmamak için örneği güncelleyin. Bunu okuyan herkes - lütfen kodu çoğaltmayın (view.loadUrl öğesini çağırmak yerine geri çağrıdan false değerini döndürün). LoadUrl çağrıldığında, sayfa içinde özel bir şema URL'si olan herhangi bir iframe'iniz varsa (<iframe src = "tel: 123" /> deyin) uygulamanızın ana çerçevesini uygulamayı büyük olasılıkla bu URL'ye yönlendirir. yan etki.
marcin.kosiba

1
@Adam ++ - evet bunu da fark ettim - Web görünümlerimden birinin neden sistem tarayıcısını kullanmadığını anlayamadım ve bunun nedeni, başka bir yöntemi geçersiz kılan yeni bir web istemcisi eklemememdi. Hata ayıklamak biraz zaman aldı.
Peter Ajtai

Harici tarayıcıda onLongClick, açık bağlantılar gibi bir şey uygulayabilir miyiz?
TheOnlyAnil

54

bazı durumlarda, URL yükleme yöntemini tetiklemeyen bir yönlendirme alırsanız onLoadResource'un geçersiz kılınması gerekebilir. bu durumda aşağıdakileri denedim:

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

Bu harika! Bir web görünümündeki bir bağlantıdan bir MP3 dosyasını çalmayı denemek için saatlerimi kurtardım. Çok teşekkürler realgt!
Brigante

25

Resmi belgelerde , bir WebView içindeki bağlantıyı tıkladığınızda URL'leri işleyen bir uygulama başlatılır. Bu varsayılan davranışı geçersiz kılmanız gerekir

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

veya yöntemde koşullu mantık yoksa bunu yapın

myWebView.setWebViewClient(new WebViewClient());

15

Bu 2 satırı kodunuza ekleyin -

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

9

Yöntem boolean shouldOverrideUrlLoading(WebView view, String url)API 24'te kullanımdan kaldırıldı. Yeni cihazları destekliyorsanız kullanmanız gerekir boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

Her ikisini de böyle bir şey yaparak kullanabilirsiniz:

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

Arulx Z'nin cevabı tam olarak aradığım şeydi.

Gezinme Çekmecesi ile, tıklanan köprülerden bağımsız olarak web'de gezinmeyi sağlamak için (böylece harici web tarayıcısını başlatmama), geri dönüşüm görünümü ve web görünümleri olan bir uygulama yazıyorum. Bunun için aşağıdaki 2 kod satırını koymak yeterli olacaktır:

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

tam olarak WebView ekstreniz altında.

Uygulanan WebView koduma bir örnek:

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

bu şekilde, web sitesinde tıklanan her bağlantı WebView'inize yüklenir. (Tüm SDK'lar güncellenmiş olarak Android Studio 1.2.2'yi kullanma)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.