272

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

4

4 に答える 4

163

ソースコードから:

// 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ネイティブブラウザーとして)実装されます。

于 2010-05-14T16:12:53.857 に答える
133

この質問にはもう少し詳細が必要だと思います。私の答えは、Androidプログラミング、The Big 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をロードしてください。私は何もしていません」と言っています。</ p>

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

WebChromeClientを使用して物事を整える 時間をかけて独自のWebViewを作成しているので、プログレスバーを追加し、ツールバーのサブタイトルをロードされたページのタイトルで更新して、少し整えましょう。

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

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

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

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

于 2016-12-25T19:36:28.493 に答える
5

Webページからのエラーをログに記録する場合は、その:を使用WebChromeClientしてオーバーライドする必要があります。onConsoleMessage

webView.settings.apply {
    javaScriptEnabled = true
    javaScriptCanOpenWindowsAutomatically = true
    domStorageEnabled = true
}
webView.webViewClient = WebViewClient()
webView.webChromeClient = MyWebChromeClient()

private class MyWebChromeClient : WebChromeClient() {
    override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
        Timber.d("${consoleMessage.message()}")
        Timber.d("${consoleMessage.lineNumber()} ${consoleMessage.sourceId()}")
        return super.onConsoleMessage(consoleMessage)
    }
}
于 2020-08-26T09:15:19.250 に答える
3

WebViewClientは、次のコールバックメソッドを提供します。これらのメソッドを使用すると、次のコンテンツWebViewへの移行方法を妨害できます。

void doUpdateVisitedHistory (WebView view, String url, boolean isReload)
void onFormResubmission (WebView view, Message dontResend, Message resend)
void onLoadResource (WebView view, String url)
void onPageCommitVisible (WebView view, String url)
void onPageFinished (WebView view, String url)
void onPageStarted (WebView view, String url, Bitmap favicon)
void onReceivedClientCertRequest (WebView view, ClientCertRequest request)
void onReceivedError (WebView view, int errorCode, String description, String failingUrl)
void onReceivedError (WebView view, WebResourceRequest request, WebResourceError error)
void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm)
void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse)
void onReceivedLoginRequest (WebView view, String realm, String account, String args)
void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)
boolean onRenderProcessGone (WebView view, RenderProcessGoneDetail detail)
void onSafeBrowsingHit (WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback)
void onScaleChanged (WebView view, float oldScale, float newScale)
void onTooManyRedirects (WebView view, Message cancelMsg, Message continueMsg)
void onUnhandledKeyEvent (WebView view, KeyEvent event)
WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
WebResourceResponse shouldInterceptRequest (WebView view, String url)
boolean shouldOverrideKeyEvent (WebView view, KeyEvent event)
boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)
boolean shouldOverrideUrlLoading (WebView view, String url)

WebChromeClientは、次のコールバックメソッドを提供します。これらのメソッドを使用して、Activityまたはの周囲Fragment更新できます。WebView

Bitmap getDefaultVideoPoster ()
View getVideoLoadingProgressView ()
void getVisitedHistory (ValueCallback<String[]> callback)
void onCloseWindow (WebView window)
boolean onConsoleMessage (ConsoleMessage consoleMessage)
void onConsoleMessage (String message, int lineNumber, String sourceID)
boolean onCreateWindow (WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)
void onExceededDatabaseQuota (String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater)
void onGeolocationPermissionsHidePrompt ()
void onGeolocationPermissionsShowPrompt (String origin, GeolocationPermissions.Callback callback)
void onHideCustomView ()
boolean onJsAlert (WebView view, String url, String message, JsResult result)
boolean onJsBeforeUnload (WebView view, String url, String message, JsResult result)
boolean onJsConfirm (WebView view, String url, String message, JsResult result)
boolean onJsPrompt (WebView view, String url, String message, String defaultValue, JsPromptResult result)
boolean onJsTimeout ()
void onPermissionRequest (PermissionRequest request)
void onPermissionRequestCanceled (PermissionRequest request)
void onProgressChanged (WebView view, int newProgress)
void onReachedMaxAppCacheSize (long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)
void onReceivedIcon (WebView view, Bitmap icon)
void onReceivedTitle (WebView view, String title)
void onReceivedTouchIconUrl (WebView view, String url, boolean precomposed)
void onRequestFocus (WebView view)
void onShowCustomView (View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback)
void onShowCustomView (View view, WebChromeClient.CustomViewCallback callback)
boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
于 2020-08-30T08:49:05.463 に答える