Android Web Görünümü, bir tarayıcı açmak yerine uygulamadaki yönlendirmelerin nasıl ele alınacağı


120

Şu anda uygulamamda eriştiğim URL'nin bir yeniden yönlendirmesi var ve bu gerçekleştiğinde WebView, uygulamamda kalmak yerine yeni bir tarayıcı açacak. Ayarları değiştirip Görünüm'ün URL'ye normal gibi yönlendirmesi, ancak yeni bir tarayıcı açmak yerine uygulamamda kalması için bir yol var mı?

Düzenle:

Yönlendirme URL'sini istiyorum, sadece onu nasıl oluşturacağımı bilmiyorum, bu yüzden bu URL'ye ulaşmanın tek yolu, istediğim URL'ye yeniden yönlendirmeye neden olacak bir URL kullanmaktır.

Örneğin: Buraya gittiğinizde: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 URL'yi gerçek ürüne nasıl yönlendireceğini görün. Uygulamamda, yeni bir tarayıcıda açarsam, bu gayet iyi olacak, ancak onu bir WebView ile uygulamamda tutarsam, k = 9780735622777 için bir arama yapıyormuş gibi görünecek, şöyle: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . VEYA, görünümü tarayıcıda açacak ve neyin uygun olduğunu gösterecektir. Ancak, her şeyi uygulamamda tutmak istiyorum.

Yanıtlar:


253

Bir WebViewClient oluşturun ve shouldOverrideUrlLoading yöntemini geçersiz kılın .

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
Method () gibi cevapları seviyorum {// nasıl kullanılacağını bilmediğiniz kodu buraya girin}
JMRboosties

19
Lütfen yukarıdaki kodu çoğaltmayın. Bunun yerine view.loadUrl'yi çağırmak yerine geri aramadan false döndür. LoadUrl çağrısı, sayfada özel bir şema URL'si olan herhangi bir iframe'iniz varsa (<iframe src = "tel: 123" />) uygulamanızın ana çerçevesini büyük olasılıkla uygulamayı bozarak bu URL'ye yönlendireceği ince bir hataya neden olur yan etki.
marcin.kosiba

@ marcin.kosiba nasıl kullanıldığına bağlı, benim kullanım durumum için tarif ettiğiniz şey bir sorun değil ama yine de
uyarıları

@Warpzit - tabii, web görünümüne yalnızca güvenilir içeriği yüklerseniz ve hiç kimsenin bu aksaklıktan yararlanamayacağına dair% 100 garantiniz varsa, sorun değil. OTOH neden riske giriyor?
marcin.kosiba

1
shouldOverrideUrlLoadingYönteme çağrılan url'nin sonraki yönlendirme url'si olduğunu nasıl bilebilirim ? Ve buna izin vermek istiyorum?
Phan Sinh

21

Resmi belgelere göre , WebView'daki herhangi bir bağlantıya tıklandığında, varsayılan olarak bir tarayıcı olan URL'leri işleyen bir uygulama başlatılır. Bunun gibi varsayılan davranışı geçersiz kılmanız gerekir

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

8
Daha da iyisi myWebView.setWebViewClient (yeni WebViewClient ()); ShouldOverrideUrlLoading öğesinin varsayılan uygulaması false döndürür.
cyroxis

14

Sadece varsayılan bir özel eklemek yeterli WebViewClientolacaktır. Bu, WebView'ın yüklenen herhangi bir url'nin kendisini işlemesini sağlar.

mWebView.setWebViewClient(new WebViewClient());

8

URL'yi yüklemeden önce web görünümünüz için özel WebviewClient geçersiz kılma shouldOverrideUrlLoading yöntemini ayarlamanız gerekecektir .

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

Yönlendirme url'lerini işlemek için örnek kodu inceleyin ve PDF'yi indirmeden web görünümünde açın. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


Örnek bir kod için yukarıdaki bağlantının mevcut olmadığını unutmayın.
Jetdog

bağlantıyı yükledim
Ashish Das

Benim için çalıştı Teşekkürler @AshishDas +10
livemaker

2

Lütfen aşağıdaki kotlin kodunu kullanın

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

Daha fazla bilgi için buraya tıklayın


2

Webviewclient'i uygulayan bir sınıf oluşturun ve aşağıda gösterildiği gibi url dizesini aşmaya izin veren aşağıdaki kodu ekleyin. Bunları görebilirsiniz [örnek] [1]

public class myWebClient extends WebViewClient {

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

Oluşturucunuzda, aşağıda gösterildiği gibi bir web görünümü nesnesi oluşturun.

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

Ardından, uygulamanızın içindeki url'lerin yüklenmesini gerçekleştirmek için aşağıdaki kodu ekleyin

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

Merhaba Hoş geldiniz, kodunuzu açıklamak ve bunun neden doğru cevap olduğunu bize göstermek ister misiniz?
Ali
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.