Mengklik URL membuka browser default

209

Saya telah memuat URL eksternal di blog saya WebView. Sekarang yang saya butuhkan adalah ketika pengguna mengklik tautan di halaman yang dimuat, itu harus bekerja seperti browser normal dan membuka tautan di dalamnya WebView. Tapi itu membuka browser default dan memuat halaman di sana?

Saya telah mengaktifkan JavaScript. Tapi tetap saja itu tidak berhasil. Apakah saya lupa sesuatu?

JaVadid
sumber

Jawaban:

353

Jika Anda menggunakan WebViewAnda harus mencegat klik sendiri jika Anda tidak ingin perilaku Android default.

Anda dapat memantau acara di a WebViewmenggunakan WebViewClient. Metode yang Anda inginkan adalah shouldOverrideUrlLoading(). Ini memungkinkan Anda untuk melakukan tindakan Anda sendiri ketika URL tertentu dipilih.

Anda mengatur WebViewClientAnda WebViewmenggunakan setWebViewClient()metode .

Jika Anda melihat WebViewsampel di SDK ada contoh yang tidak hanya apa yang Anda inginkan. Sesederhana:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}
Dave Webb
sumber
97
Sepertinya ini adalah perilaku default untuk WebViewClientdan tidak perlu subklasifikasi jika ini yang Anda lakukan. Saya berhasil ini hanya dengan melakukanmyWebView.setWebViewClient(new WebViewClient());
Adam
7
@ dave-webb perbarui sampel untuk tidak memanggil loadUrl. Semua orang yang membaca ini - tolong jangan meniru kode (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 (katakan <iframe src = "tel: 123" />) itu akan menavigasi kerangka utama aplikasi Anda ke URL yang kemungkinan besar melanggar aplikasi sebagai efek samping.
marcin.kosiba
1
@ Adam ++ - ya saya perhatikan ini juga - Saya tidak bisa mengerti mengapa salah satu tampilan web saya TIDAK menggunakan browser sistem, dan itu karena saya telah menambahkan klien web baru untuk itu yang hanya mengganti metode LAIN. Butuh beberapa saat untuk debug.
Peter Ajtai
Bisakah kita menerapkan sesuatu seperti: onLongClick, buka tautan di peramban eksternal?
TheOnlyAnil
54

dalam beberapa kasus Anda mungkin perlu mengganti onLoadResource jika Anda mendapatkan arahan ulang yang tidak memicu metode pemuatan url. dalam hal ini saya mencoba yang berikut:

@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
sumber
Ini bagus! Menghemat saya berjam-jam mencoba mencari cara memutar file MP3 dari tautan di tampilan web. Terima kasih banyak!
Brigante
25

Dokumentasi resmi mengatakan, klik pada tautan di WebView akan meluncurkan aplikasi yang menangani URL. Anda perlu mengganti perilaku default ini

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

atau jika tidak ada logika kondisional dalam metode cukup lakukan ini

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

Tambahkan 2 baris ini dalam kode Anda -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());
Membingungkan
sumber
9

Metode boolean shouldOverrideUrlLoading(WebView view, String url)ini sudah tidak digunakan lagi di API 24. Jika Anda mendukung perangkat baru, Anda harus menggunakannyaboolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request) .

Anda dapat menggunakan keduanya dengan melakukan sesuatu seperti ini:

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
sumber
6

Jawaban Arulx Z tepat seperti yang saya cari.

Saya sedang menulis aplikasi dengan Navigasi Drawer dengan tampilan daur ulang dan tampilan web, untuk menjaga penjelajahan web di dalam aplikasi terlepas dari hyperlink yang diklik (sehingga tidak meluncurkan browser web eksternal). Untuk itu cukuplah menempatkan 2 baris kode berikut:

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

persis di bawah pernyataan WebView Anda.

Berikut adalah contoh kode WebView yang saya implementasikan:

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

dengan cara ini, setiap tautan yang diklik di situs web akan dimuat di dalam WebView Anda. (Menggunakan Android Studio 1.2.2 dengan semua SDK diperbarui)

Samuele Bolognini
sumber