Apa perbedaan antara setWebViewClient vs setWebChromeClient?


Jawaban:


148

Dari kode sumber :

// Instance of WebViewClient that is the client callback.
private volatile WebViewClient mWebViewClient;
// Instance of WebChromeClient for handling all chrome functions.
private volatile WebChromeClient mWebChromeClient;

// SOME OTHER SUTFFF.......

/**
 * Set the WebViewClient.
 * @param client An implementation of WebViewClient.
 */
public void setWebViewClient(WebViewClient client) {
    mWebViewClient = client;
}

/**
 * Set the WebChromeClient.
 * @param client An implementation of WebChromeClient.
 */
public void setWebChromeClient(WebChromeClient client) {
    mWebChromeClient = client;
}

Menggunakan WebChromeClient memungkinkan Anda untuk menangani dialog Javascript, favicon, judul, dan perkembangannya. Lihatlah contoh ini: Menambahkan dukungan lansiran () ke WebView

Sekilas, ada terlalu banyak perbedaan WebViewClient & WebChromeClient . Tetapi, pada dasarnya: jika Anda mengembangkan WebView yang tidak membutuhkan terlalu banyak fitur selain rendering HTML, Anda bisa menggunakan a WebViewClient. Di sisi lain, jika Anda ingin (misalnya) memuat favicon halaman yang Anda render, Anda harus menggunakan WebChromeClientobjek dan menimpa onReceivedIcon(WebView view, Bitmap icon).

Sering kali, jika Anda tidak ingin khawatir tentang hal-hal itu ... Anda bisa melakukan ini:

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

Dan WebView Anda (secara teori) akan menerapkan semua fitur (sebagai browser asli android).


26
Dalam formulir ini, jawabannya tidak lengkap. ChromeClient memungkinkan untuk menangani hal-hal yang disebutkan tetapi apa itu ViewClient dan apa persamaan dan perbedaannya?
Pentium10

3
Apakah metode ini membantu meningkatkan beberapa fitur tampilan web standar yang buruk? terutama untuk animasi dan transisi css3?
Ata Iravani

1
Bisakah saya menggunakan keduanya sekaligus?
Sergey Dirin

1
@SergeyDirin: stackoverflow.com/a/6475858 . Lihat jawaban ini, Anda dapat menggunakan keduanya sekaligus.
hoangtu23

Bagaimana cara menangani izin untuk kamera di webviewclient jika tidak memiliki chrome?
j2emanue

100

Saya merasa pertanyaan ini perlu sedikit lebih detail. Jawaban saya terinspirasi dari Pemrograman Android, The Nerd Ranch Guide (edisi ke-2).

Secara default , JavaScript tidak aktif di WebView. Anda tidak selalu harus mengaktifkannya, tetapi untuk beberapa aplikasi, mungkin memang membutuhkannya.

Memuat URL harus dilakukan setelah mengonfigurasi WebView, jadi Anda melakukan yang terakhir. Sebelum itu, Anda mengaktifkan JavaScript dengan menelepon getSettings()untuk mendapatkan instance dari WebSettings dan menelepon WebSettings.setJavaScriptEnabled(true). WebSettings adalah yang pertama dari tiga cara Anda dapat memodifikasi WebView Anda. Ini memiliki berbagai properti yang dapat Anda atur, seperti string agen pengguna dan ukuran teks.

Setelah itu, Anda mengkonfigurasi WebViewClient Anda. WebViewClient adalah antarmuka acara. Dengan menyediakan implementasi WebViewClient Anda sendiri, Anda dapat merespons acara rendering. Misalnya, Anda bisa mendeteksi kapan pemberi render mulai memuat gambar dari URL tertentu atau memutuskan apakah akan mengirim kembali permintaan POST ke server.

WebViewClient memiliki banyak metode yang bisa Anda timpa, yang sebagian besar tidak akan Anda tangani. Namun, Anda harus mengganti implementasi WebViewClient default untuk shouldOverrideUrlLoading(WebView, String). Metode ini menentukan apa yang akan terjadi ketika URL baru dimuat di WebView, seperti dengan menekan tautan. Jika Anda mengembalikan true, Anda mengatakan, "Jangan menangani URL ini, saya sendiri yang menangani." Jika Anda mengembalikan false, Anda berkata, "Silakan memuat URL ini, WebView, saya tidak melakukan apa-apa dengannya."

Implementasi default meluncurkan maksud tersirat dengan URL, seperti yang Anda lakukan sebelumnya. Namun, sekarang, ini akan menjadi masalah besar. Hal pertama yang dilakukan oleh beberapa Aplikasi Web adalah mengarahkan Anda ke versi mobile situs web. Dengan WebViewClient default, itu berarti Anda segera dikirim ke browser web default pengguna. Inilah yang ingin Anda hindari. Cara mengatasinya sederhana - cukup timpa implementasi default dan kembalikan false.

Gunakan WebChromeClient untuk merapikan segalanya Karena Anda meluangkan waktu untuk membuat WebView Anda sendiri, mari kita sedikit merapikannya dengan menambahkan bilah kemajuan dan memperbarui subtitle bilah alat dengan judul halaman yang dimuat.

Untuk menghubungkan ProgressBar, Anda akan menggunakan callback kedua pada WebView: WebChromeClient.

WebViewClient adalah antarmuka untuk merespons acara rendering; WebChromeClient adalah antarmuka acara untuk bereaksi terhadap peristiwa yang seharusnya mengubah elemen chrome di browser. Ini termasuk peringatan JavaScript, favicon, dan tentu saja pembaruan untuk memuat progres dan judul halaman saat ini.

Hubungkan onCreateView(…). Menggunakan WebChromeClient untuk merapikan segalanya. Kemajuan pembaruan dan pembaruan judul masing-masing memiliki metode panggilan balik sendiri, onProgressChanged(WebView, int)dan onReceivedTitle(WebView, String). Kemajuan yang Anda terima dari onProgressChanged(WebView, int)adalah bilangan bulat dari 0 hingga 100. Jika 100, Anda tahu bahwa halaman tersebut selesai dimuat, jadi Anda menyembunyikan ProgressBar dengan mengatur visibilitasnya ke View.GONE.

Penafian: Informasi ini diambil dari Pemrograman Android: Panduan Peternakan Big Nerd dengan izin dari penulis. Untuk informasi lebih lanjut tentang buku ini atau untuk membeli salinan, silakan kunjungi bignerdranch.com.


11
Saya pikir ini adalah jawaban yang lebih baik daripada yang diterima.
redbeam_
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.