2010-05-14 42 views

Trả lời

119

Từ source code:

// 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à sự tiến bộ. Hãy xem ví dụ này: Adding alert() support to a WebView

Thoạt nhìn, có quá nhiều sự khác biệt WebViewClient & WebChromeClient. Tuy nhiên, 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 số WebViewClient. Mặt khác, nếu bạn muốn (ví dụ) tải favicon của trang bạn đang hiển thị, bạn nên sử dụng đối tượng WebChromeClient và ghi đè onReceivedIcon(WebView view, Bitmap icon).

Hầu hết các lần, nếu bạn không muốn phải lo lắng về những điều ... bạn có thể chỉ 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 sẽ (về mặt lý thuyết) đều tính năng thực hiện (như trình duyệt gốc của Android).

+20

Trong biểu mẫu này, câu trả lời chưa hoàn thành. ChromeClient cho phép xử lý những điều 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 chế độ xem web mặc định không? đặc biệt đối với hoạt ảnh và chuyển tiếp css3? –

+2

Tôi không nghĩ vậy. – Cristian

19

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 (ấn bản thứ 2).

Theo mặc định, JavaScript bị 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ể yêu cầu nó.

Tải URL phải được thực hiện sau khi định cấu hình WebView, vì vậy bạn làm điều đó cuối cùng. Trước đó, bạn bật JavaScript bằng cách gọi getSettings() để có được một phiên bản của WebSettings và gọi WebSettings.setJavaScriptEnabled(true). WebSettings là lần đầ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 mình. 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ể trả lờ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 tới máy chủ hay không.

WebViewClient có nhiều phương pháp bạn có thể ghi đè, phần lớn 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 mặc định của WebViewClient là shouldOverrideUrlLoading(WebView, String). Phương thức 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ả về true, bạn đang nói, "Không xử lý URL này, tôi tự xử lý nó." Nếu bạn trả về false, bạn đang nói, "Tiếp tục và tải URL này, WebView, tôi sẽ không làm gì với nó . ”

Triển khai mặc định kích hoạ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 làm 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 sẽ được gửi ngay tới 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. Việc sửa chữa rất đơn giản - chỉ cần ghi đè cài đặt mặc định và trả về false.

Sử dụng WebChromeClient để làm đẹp mọi thứ lên Vì bạn đang dành thời gian để tạo WebView riêng của bạn, hãy làm đẹp nó lên một chút bằng cách thêm một thanh tiến trình và cập nhật phụ đề của thanh công cụ với các tiêu đề của trang 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à giao diện để trả lời các sự kiện hiển thị; WebChromeClient là một giao diện sự kiện để phản ứng lại các sự kiện sẽ thay đổi các thành phần 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 cập nhật cho quá trình tải và tiêu đề của trang hiện tại.

Treo nó lên trong onCreateView(…). Sử dụng WebChromeClient để tạo mọi thứ lên Cập nhật tiến trình và cập nhật tiêu đề đề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 từ 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 chế độ hiển thị là View.GONE.

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

Các vấn đề liên quan