ความแตกต่างระหว่าง setWebViewClient กับ setWebChromeClient คืออะไร


คำตอบ:


148

จากซอร์สโค้ด :

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

การใช้ WebChromeClient ช่วยให้คุณสามารถจัดการไดอะล็อก Javascript favicons ชื่อเรื่องและความคืบหน้าได้ ดูตัวอย่างนี้: การเพิ่มการสนับสนุน alert () ใน WebView

ได้อย่างรวดเร็วก่อนมีความแตกต่างมากเกินไปWebViewClient & WebChromeClient แต่โดยทั่วไปถ้าคุณกำลังพัฒนา WebView ที่จะไม่จำเป็นต้องมีคุณสมบัติมากเกินไป แต่การแสดงผล HTML WebViewClientคุณก็สามารถใช้ ในทางกลับกันถ้าคุณต้องการ (ตัวอย่างเช่น) โหลด favicon ของหน้าคุณจะแสดงผลที่คุณควรใช้วัตถุและแทนที่WebChromeClientonReceivedIcon(WebView view, Bitmap icon)

ส่วนใหญ่แล้วหากคุณไม่ต้องการกังวลเกี่ยวกับสิ่งเหล่านั้น ... คุณสามารถทำสิ่งนี้ได้:

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

และ WebView ของคุณจะ (ในทางทฤษฎี) มีคุณสมบัติทั้งหมดที่ใช้งาน (เป็นเบราว์เซอร์เนนของ Android)


26
ในแบบฟอร์มนี้คำตอบไม่สมบูรณ์ ChromeClient อนุญาตให้จัดการสิ่งที่ระบุ แต่ ViewClient คืออะไรและมีความคล้ายคลึงและความแตกต่างอะไรบ้าง
Pentium10

3
วิธีนี้จะช่วยปรับปรุงคุณสมบัติที่ไม่ดีของการดูเว็บเริ่มต้นหรือไม่ โดยเฉพาะอย่างยิ่งสำหรับภาพเคลื่อนไหวและการเปลี่ยน css3?
Ata Iravani

1
ฉันสามารถใช้ทั้งสองพร้อมกันได้หรือไม่
Sergey Dirin

1
@SergeyDirin: stackoverflow.com/a/6475858 อ้างถึงคำตอบนี้คุณสามารถใช้ทั้งสองในครั้งเดียว
hoangtu23

วิธีจัดการกับการอนุญาตให้ใช้กล้องใน webviewclient ถ้าไม่มีโครเมียม
j2emanue

100

ฉันรู้สึกว่าคำถามนี้ต้องการรายละเอียดอีกเล็กน้อย คำตอบของฉันได้รับแรงบันดาลใจจากการเขียนโปรแกรม Android, The Nerd Ranch Guide (รุ่นที่ 2)

ตามค่าเริ่มต้น JavaScript จะปิดใน WebView คุณไม่จำเป็นต้องเปิดใช้เสมอ แต่สำหรับบางแอพอาจจำเป็นต้องใช้

การโหลด URL จะต้องทำหลังจากกำหนดค่า WebView ดังนั้นคุณต้องดำเนินการครั้งสุดท้าย ก่อนที่คุณเปิด JavaScript บนโดยการเรียกgetSettings()เพื่อให้ได้ตัวอย่างของ WebSettings WebSettings.setJavaScriptEnabled(true)และโทร WebSettings เป็นวิธีแรกในสามวิธีที่คุณสามารถแก้ไข WebView ของคุณ มันมีคุณสมบัติต่าง ๆ ที่คุณสามารถตั้งค่าเช่นสตริงตัวแทนผู้ใช้และขนาดตัวอักษร

หลังจากนั้นคุณกำหนดค่า WebViewClient ของคุณ WebViewClient เป็นอินเทอร์เฟซเหตุการณ์ ด้วยการให้การใช้ WebViewClient ของคุณเองคุณสามารถตอบสนองต่อการแสดงผลเหตุการณ์ ตัวอย่างเช่นคุณสามารถตรวจพบเมื่อตัวแสดงเริ่มโหลดภาพจาก URL ที่ระบุหรือตัดสินใจว่าจะส่งคำขอ POST ไปยังเซิร์ฟเวอร์อีกครั้ง

WebViewClientมีหลายวิธีที่คุณสามารถแทนที่ซึ่งส่วนใหญ่คุณจะไม่จัดการ แต่คุณจะต้องเปลี่ยนการดำเนินงาน WebViewClient shouldOverrideUrlLoading(WebView, String)เริ่มต้นของ วิธีนี้จะกำหนดสิ่งที่จะเกิดขึ้นเมื่อโหลด URL ใหม่ใน WebView เช่นโดยการกดลิงค์ หากคุณกลับมาจริงคุณกำลังพูดว่า“ อย่าจัดการ URL นี้ฉันจัดการเอง” หากคุณส่งคืนเท็จคุณกำลังพูดว่า“ เอาเลยโหลด URL นี้ WebView ฉันไม่ได้ทำอะไรเลย”

การใช้งานเริ่มต้นจะทำให้เกิดความตั้งใจโดยนัยกับ URL เช่นเดียวกับที่คุณทำก่อนหน้านี้ แม้ว่าตอนนี้อาจเป็นปัญหาที่รุนแรง สิ่งแรกที่บางแอปพลิเคชั่นบนเว็บทำคือนำคุณไปยังเว็บไซต์สำหรับมือถือ ด้วย WebViewClient เริ่มต้นนั่นหมายความว่าคุณจะถูกส่งไปยังเว็บเบราว์เซอร์เริ่มต้นของผู้ใช้ทันที นี่เป็นเพียงสิ่งที่คุณพยายามหลีกเลี่ยง การแก้ไขนั้นง่าย - เพียงแค่แทนที่การเริ่มต้นใช้งานและส่งคืนค่าเท็จ

ใช้ WebChromeClient เพื่อ spruce สิ่งต่าง ๆ ขึ้นมา เนื่องจากคุณสละเวลาในการสร้าง WebView ของคุณเองให้ spruce มันขึ้นมาเล็กน้อยโดยการเพิ่มแถบความคืบหน้าและอัปเดตคำบรรยายของแถบเครื่องมือด้วยชื่อเรื่องของหน้าที่โหลด

ที่จะขอขึ้น ProgressBar คุณจะใช้โทรกลับที่สองใน WebChromeClientWebView:

WebViewClient เป็นอินเทอร์เฟซสำหรับตอบสนองต่อการแสดงผลเหตุการณ์ WebChromeClient เป็นอินเทอร์เฟซเหตุการณ์สำหรับตอบสนองต่อเหตุการณ์ที่ควรเปลี่ยนองค์ประกอบของโครมรอบเบราว์เซอร์ ซึ่งรวมถึงการแจ้งเตือน JavaScript, favicons และการปรับปรุงหลักสูตรสำหรับความคืบหน้าในการโหลดและชื่อของหน้าปัจจุบัน

onCreateView(…)ตะขอขึ้นใน ใช้ WebChromeClient กับสิ่งโก้เก๋การอัปเดตความคืบหน้าและชื่อการปรับปรุงแต่ละคนมีวิธีการโทรกลับของตัวเอง และonProgressChanged(WebView, int) onReceivedTitle(WebView, String)ความคืบหน้าคุณได้รับจากonProgressChanged(WebView, int)เป็นจำนวนเต็มจาก 0 ถึง 100 ถ้าเป็น 100 คุณรู้ว่าหน้านี้มีการโหลดทำเพื่อให้คุณซ่อน ProgressBar View.GONEโดยการตั้งค่าการแสดงผลในการ

คำเตือน:ข้อมูลนี้นำมาจากการเขียนโปรแกรม Android: The Big Nerd Ranch Guide ได้รับอนุญาตจากผู้เขียน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหนังสือเล่มนี้หรือสั่งซื้อสำเนากรุณาเยี่ยมชม bignerdranch.com


11
ฉันคิดว่านี่เป็นคำตอบที่ดีกว่าคำตอบที่ยอมรับได้
redbeam_
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.