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.

James
sumber

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
   }
});
xandy
sumber
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;
        }
    });
abbas
sumber
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());
Sampai
sumber
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

Ashish Das
sumber
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

Shalu TD
sumber
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() {
      // 
      //
    }
Daniel Nyamasyo
sumber
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);
        
    }
}
Rasul Mammadov
sumber
Hai Selamat datang, apakah Anda ingin menjelaskan kode Anda dan menunjukkan kepada kami mengapa ini jawaban yang benar?
Ali