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ダイアログ、ファビコン、タイトル、進行状況を処理できます。この例を見てください: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ネイティブブラウザとして)。


26
このフォームでは、答えは完全ではありません。ChromeClientは列挙されたものを処理できますが、ViewClientとは何で、類似点と相違点は何ですか?
Pentium10

3
この方法は、デフォルトのWebViewのいくつかの貧弱な機能を改善するのに役立ちますか?特にcss3のアニメーションと遷移については?
Ata Iravani、

1
両方を同時に使用できますか?
セルゲイディリン

1
@SergeyDirin:stackoverflow.com/a/6475858。この回答を参照してください。両方を同時に使用できます。
hoangtu23

Chromeがない場合にwebviewclientでカメラの権限を処理するにはどうすればよいですか?
j2emanue

99

この質問にはもう少し詳細が必要だと思います。私の答えは、Androidプログラミング、The Nerd Ranch Guide(第2版)からインスピレーションを得ています。

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

URLのロードはWebViewの設定後に行う必要があるため、最後に行います。その前に、を呼び出しgetSettings()てWebSettingsのインスタンスを取得し、を呼び出すことでJavaScriptをオンにしますWebSettings.setJavaScriptEnabled(true)。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は、ブラウザ周辺のクロムの要素を変更する必要があるイベントに反応するためのイベントインターフェイスです。これには、JavaScriptアラート、ファビコン、およびもちろん、進行状況と現在のページのタイトルの更新に関する更新が含まれます。

に接続しonCreateView(…)ます。WebChromeClientを使用して状況を改善するProgressの更新とTitleの更新には、それぞれ独自のコールバックメソッドが onProgressChanged(WebView, int)ありonReceivedTitle(WebView, String)ます。受け取る進行状況onProgressChanged(WebView, int)は0〜100の整数です。100の場合、ページの読み込みが完了しているため、可視性をに設定してProgressBarを非表示にしView.GONEます。

免責事項:この情報は、作者の許可を得て、Androidプログラミング:ビッグナードランチガイドから取得されました。この本の詳細またはコピーを購入するには、bignerdranch.comにアクセスしてください。


11
これは受け入れられたものより良い答えだと思います。
redbeam_
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.