Android WebView, cara menangani pengalihan dalam aplikasi alih-alih membuka browser


120

Jadi saat ini di aplikasi saya, URL yang saya akses memiliki pengalihan, dan ketika ini terjadi, WebView akan membuka browser baru, alih-alih tetap berada di aplikasi saya. Adakah cara saya dapat mengubah pengaturan sehingga Tampilan akan dialihkan ke URL seperti biasa, tetapi tetap di aplikasi saya alih-alih membuka browser baru?

Edit:

Saya ingin URL pengalihan, saya hanya tidak tahu cara membuatnya, jadi satu-satunya cara untuk mendapatkan URL itu adalah melalui salah satu yang akan menyebabkan pengalihan ke URL yang saya inginkan.

Misalnya: Ketika Anda pergi ke sini: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 perhatikan bagaimana ini akan mengarahkan URL ke produk yang sebenarnya. Di aplikasi saya, jika saya membukanya di browser baru, itu akan baik-baik saja, namun jika saya menyimpannya di aplikasi saya dengan WebView, itu akan muncul seolah-olah sedang mencari k = 9780735622777, seperti ini: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . ATAU, ini akan membuka tampilan di browser dan menunjukkan apa yang sesuai. Namun, saya ingin menyimpan semuanya di aplikasi saya.

Jawaban:


253

Buat WebViewClient, dan ganti metode 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
Saya suka jawaban yang seperti metode () {// cukup letakkan kode yang Anda tidak tahu cara menggunakannya di sini}
JMRboosties

19
Harap jangan mereplikasi kode di atas. Kembalikan false dari callback alih-alih memanggil view.loadUrl. Memanggil loadUrl memperkenalkan bug halus di mana jika Anda memiliki iframe di dalam halaman dengan URL skema khusus (katakanlah <iframe src = "tel: 123" />), itu akan menavigasi bingkai utama aplikasi Anda ke URL tersebut kemungkinan besar merusak aplikasi sebagai efek samping.
marcin.kosiba

@ marcin.kosiba tergantung bagaimana penggunaannya, untuk kasus penggunaan saya apa yang Anda jelaskan bukanlah masalah tetapi saya masih menghargai
pemberitahuan

@Warpzit - tentu, jika Anda hanya memuat konten tepercaya ke tampilan web dan memiliki jaminan 100% bahwa tidak ada yang dapat memanfaatkan kesalahan itu, oke. OTOH mengapa mengambil resiko?
marcin.kosiba

1
Bagaimana saya bisa tahu url yang dipanggil ke shouldOverrideUrlLoadingmetode adalah url pengalihan berikutnya? Dan saya ingin mengizinkannya?
Phan Sinh

21

Menurut dokumentasi resmi , klik pada tautan apa pun di WebView meluncurkan aplikasi yang menangani URL, yang secara default adalah browser. Anda perlu mengganti perilaku default seperti ini

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

8
Bahkan lebih baik panggil myWebView.setWebViewClient (new WebViewClient ()); Implementasi default shouldOverrideUrlLoading menghasilkan nilai false.
cyroxis

14

Cukup menambahkan custom default WebViewClientsudah cukup. Ini membuat WebView menangani sendiri url yang dimuat.

mWebView.setWebViewClient(new WebViewClient());

8

Anda harus menyetel metode penggantian WebviewClient kustom Anda harusOverrideUrlLoading untuk tampilan web Anda sebelum memuat 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.
            }
        });

Lihat contoh kode untuk menangani url pengalihan dan buka PDF tanpa mengunduh, di tampilan web. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


Perhatikan bahwa tautan di atas untuk kode contoh tidak ada.
Jetdog

saya telah mengupload linknya.
Ashish Das

Bekerja untuk saya Terima kasih @AshishDas +10
livemaker

2

Silakan gunakan kode kotlin di bawah ini

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

Untuk info lebih lanjut klik disini


2

Buat kelas yang mengimplementasikan webviewclient dan tambahkan kode berikut yang memungkinkan ovveriding string url seperti yang ditunjukkan di bawah ini. Anda dapat melihat [contoh] [1] ini

public class myWebClient extends WebViewClient {

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

Di konstruktor Anda, buat objek webview seperti yang ditunjukkan di bawah ini.

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

Kemudian tambahkan kode berikut untuk melakukan pemuatan url di dalam aplikasi Anda

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

Hai Selamat datang, apakah Anda ingin menjelaskan kode Anda dan menunjukkan kepada kami mengapa ini jawaban yang benar?
Ali
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.