web-dev-qa-db-ja.com

setWebViewClientとsetWebChromeClientの違いは何ですか?

AndroidのsetWebViewClientsetWebChromeClientの違いは何ですか?

210
Pentium10

ソースコード から:

// 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ダイアログ、ファビコン、タイトル、進行状況を処理できます。この例を見てください: WebViewへのalert()サポートの追加

一見、違いが多すぎます WebViewClientWebChromeClient 。ただし、基本的には、HTMLをレンダリングする機能をあまり必要としないWebViewを開発する場合は、WebViewClientを使用できます。一方、レンダリングしているページのファビコンを(たとえば)ロードする場合は、WebChromeClientオブジェクトを使用して、onReceivedIcon(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ネイティブブラウザーとして)。

135
Cristian

この質問にはもう少し詳細が必要だと思います。私の答えは、Androidプログラミング、The Nerd Ranch Guide(第2版)から着想を得たものです。

デフォルト、WebViewではJavaScriptはオフになっています。常にオンにする必要はありませんが、一部のアプリでは必要になる場合があります。

URLの読み込みは、WebViewの構成後に行う必要があるため、最後に行います。その前に、getSettings()を呼び出してWebSettingsのインスタンスを取得し、WebSettings.setJavaScriptEnabled(true)を呼び出してJavaScriptをオンにします。 WebSettingsは、WebViewを変更できる3つの方法の最初のものです。ユーザーエージェント文字列やテキストサイズなど、設定可能なさまざまなプロパティがあります。

その後、WebViewClientを設定します。WebViewClientはイベントインターフェイスです。WebViewClientの独自の実装を提供することで、レンダリングイベントに応答できます。たとえば、レンダラーが特定のURLから画像の読み込みを開始するタイミングを検出できますまたは、POSTリクエストをサーバーに再送信するかどうかを決定します。

WebViewClientにはオーバーライド可能な多くのメソッドがありますが、ほとんどのメソッドは処理しません。ただし、デフォルトのWebViewClientのshouldOverrideUrlLoading(WebView, String)の実装を置き換える必要があります。このメソッドは、リンクを押すなどして、新しいURLがWebViewにロードされたときに何が起こるかを決定します。 trueを返すと、「このURLを処理しないで、自分で処理しています」と言っています。falseを返すと、「このURL、WebViewをロードして、何もしません」と言っています。 」

デフォルトの実装では、以前と同様に、URLで暗黙的なインテントが起動されます。ただし、これは深刻な問題になります。一部のWebアプリケーションが最初に行うことは、Webサイトのモバイルバージョンにリダイレクトすることです。デフォルトのWebViewClientを使用すると、ユーザーのデフォルトのWebブラウザーにすぐに送信されます。これはまさにあなたが避けようとしていることです。修正は簡単です。デフォルトの実装をオーバーライドしてfalseを返すだけです。

WebChromeClientを使用して物事を整えます独自のWebViewを作成するのに時間がかかっているので、進行状況バーを追加し、読み込まれたページのタイトルでツールバーのサブタイトルを更新することで少し改善します。

ProgressBarを接続するには、WebViewの2番目のコールバックWebChromeClientを使用します。

WebViewClientは、レンダリングイベントに応答するためのインターフェイスです。 WebChromeClientは、ブラウザー周辺のchromeの要素を変更するイベントに反応するためのイベントインターフェイスです。これには、JavaScriptアラート、favicons、およびもちろん進行状況と現在のページのタイトルの更新が含まれます。

onCreateView(…)に接続します。 WebChromeClientを使用して処理を進めるプログレス更新とタイトル更新には、それぞれ独自のコールバックメソッドonProgressChanged(WebView, int)およびonReceivedTitle(WebView, String)があります。 onProgressChanged(WebView, int)から受け取る進行状況は、0から100までの整数です。100であれば、ページの読み込みが完了していることがわかります。そのため、ProgressBarの表示をView.GONEに設定して非表示にします。

免責事項:この情報は、Android Programming:The Big Nerd Ranch Guide from authors from authorsから取得したものです。この本の詳細またはコピーの購入については、bignerdranch.comをご覧ください。