Sự khác biệt giữa setWebViewClient so với setWebChromClient là gì?


Câu trả lời:


148

Từ mã nguồn :

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

Sử dụng WebChromeClient cho phép bạn xử lý các hộp thoại Javascript, favicon, tiêu đề và tiến trình. Hãy xem ví dụ này: Thêm hỗ trợ alert () vào WebView

Thoạt nhìn, có quá nhiều sự khác biệt WebViewClient & WebChromeClient . Nhưng, về cơ bản: nếu bạn đang phát triển một WebView không yêu cầu quá nhiều tính năng nhưng hiển thị HTML, bạn chỉ có thể sử dụng một WebViewClient. Mặt khác, nếu bạn muốn (ví dụ) tải favicon của trang bạn đang kết xuất, bạn nên sử dụng một WebChromeClientđối tượng và ghi đè lên onReceivedIcon(WebView view, Bitmap icon).

Hầu hết thời gian, nếu bạn không muốn lo lắng về những điều đó ... bạn có thể làm điều này:

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

Và WebView của bạn (về lý thuyết) sẽ có tất cả các tính năng được triển khai (như trình duyệt gốc của Android).


26
Trong hình thức này, câu trả lời là không đầy đủ. ChromeClient cho phép xử lý những thứ được liệt kê nhưng ViewClient là gì và điểm tương đồng và khác biệt là gì?
Pentium10

3
Phương pháp này có giúp cải thiện một số tính năng kém của webview mặc định không? đặc biệt là cho hình ảnh động và chuyển tiếp css3?
Ata Iravani

1
Tôi có thể sử dụng cả hai cùng một lúc không?
Serge Dirin

1
@SergeyDirin: stackoverflow.com/a/6475858 . Tham khảo câu trả lời này, bạn có thể sử dụng cả hai cùng một lúc.
hoangtu23

Làm cách nào để xử lý quyền cho camera trong webviewclient nếu không có chrome?
j2emanue

99

Tôi cảm thấy câu hỏi này cần thêm một chút chi tiết. Câu trả lời của tôi được lấy cảm hứng từ Lập trình Android, The Nerd Ranch Guide (phiên bản 2).

Theo mặc định , JavaScript tắt trong WebView. Bạn không phải lúc nào cũng cần có nó, nhưng đối với một số ứng dụng, có thể cần phải có nó.

Việc tải URL phải được thực hiện sau khi định cấu hình WebView, do đó bạn thực hiện việc đó sau cùng. Trước đó, bạn bật JavaScript bằng cách gọi getSettings()để lấy phiên bản WebS Settings và gọi WebSettings.setJavaScriptEnabled(true). Cài đặt Web là cách đầu tiên trong ba cách bạn có thể sửa đổi WebView của mình. Nó có các thuộc tính khác nhau mà bạn có thể đặt, như chuỗi tác nhân người dùng và kích thước văn bản.

Sau đó, bạn định cấu hình WebViewClient của bạn. WebViewClient là một giao diện sự kiện. Bằng cách cung cấp triển khai WebViewClient của riêng bạn, bạn có thể đáp ứng với các sự kiện kết xuất. Ví dụ: bạn có thể phát hiện khi trình kết xuất bắt đầu tải hình ảnh từ một URL cụ thể hoặc quyết định có gửi lại yêu cầu POST đến máy chủ hay không.

WebViewClient có nhiều phương thức bạn có thể ghi đè, hầu hết trong số đó bạn sẽ không giải quyết. Tuy nhiên, bạn cần phải thay thế triển khai WebViewClient mặc địnhshouldOverrideUrlLoading(WebView, String) . Phương pháp này xác định điều gì sẽ xảy ra khi một URL mới được tải trong WebView, giống như bằng cách nhấn một liên kết. Nếu bạn trả lại đúng, bạn đang nói, thì Đừng xử lý URL này, tôi tự xử lý nó. Nếu bạn trả về sai, bạn đang nói, hãy tiếp tục và tải URL này, WebView, tôi không làm gì với nó cả.

Việc triển khai mặc định thực hiện một ý định ngầm với URL, giống như bạn đã làm trước đó. Bây giờ, mặc dù, đây sẽ là một vấn đề nghiêm trọng. Điều đầu tiên mà một số Ứng dụng Web thực hiện là chuyển hướng bạn đến phiên bản di động của trang web. Với WebViewClient mặc định, điều đó có nghĩa là bạn ngay lập tức được gửi đến trình duyệt web mặc định của người dùng. Đây chỉ là những gì bạn đang cố gắng tránh. Cách khắc phục rất đơn giản - chỉ cần ghi đè cài đặt mặc định và trả về false.

Sử dụng WebChromeClient để cải thiện mọi thứ Vì bạn đang dành thời gian để tạo WebView của riêng mình, hãy tạo ra một chút bằng cách thêm thanh tiến trình và cập nhật phụ đề của thanh công cụ với tiêu đề của trang được tải.

Để kết nối ProgressBar, bạn sẽ sử dụng cuộc gọi lại thứ hai trên WebView: WebChromeClient .

WebViewClient là một giao diện để đáp ứng với các sự kiện kết xuất; WebChromeClient là một giao diện sự kiện để phản ứng với các sự kiện sẽ thay đổi các yếu tố của chrome xung quanh trình duyệt. Điều này bao gồm các cảnh báo JavaScript, favicon và tất nhiên các bản cập nhật để tải tiến trình và tiêu đề của trang hiện tại.

Móc nó lên trong onCreateView(…). Sử dụng WebChromeClient để cải thiện mọi thứ, cập nhật tiến độ và cập nhật tiêu đề, mỗi phương thức đều có phương thức gọi lại riêng onProgressChanged(WebView, int)onReceivedTitle(WebView, String). Tiến trình bạn nhận được onProgressChanged(WebView, int)là một số nguyên từ 0 đến 100. Nếu là 100, bạn biết rằng trang đã được tải xong, vì vậy bạn ẩn ProgressBar bằng cách đặt mức độ hiển thị của nó thành View.GONE.

Tuyên bố miễn trừ trách nhiệm: Thông tin này được lấy từ Lập trình Android: Hướng dẫn trang trại Big Nerd với sự cho phép của các tác giả. Để biết thêm thông tin về cuốn sách này hoặc để mua một bản sao, vui lòng truy cập bignerdranch.com.


11
Tôi nghĩ rằng đây là một câu trả lời tốt hơn so với câu trả lời được chấp nhận.
redbeam_
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.