web-dev-qa-db-ja.com

WebViewClientとWebChromeClientは相互に排他的ですか?

これから 素晴らしい説明WebViewClientWebChromeClientの違いについて、一方を使用する場合、もう一方を使用するべきではないようです(同じWebViewオブジェクトに対して)。

私の理解は正しいですか?

そうでない場合、同じWebViewClientオブジェクトに対してWebChromeClientandWebViewの両方をいつ使用しますか?

同じWebViewClientオブジェクトに対してWebChromeClientWebViewの両方のみを使用する状況の例はありますか特定の目標を達成しますか?

65
ef2011

あなたは確かに両方を使用することができます、彼らは単に異なる機能を持っています。独自のカスタムWebViewClientを設定すると、onPageFinished、shouldOverrideUrlLoadingなどを処理できます。WebChromeClientでは、Javascriptのalert()およびその他の関数を処理できます。

たとえば、独自のクラスを作成します。

public class MyWebChromeClient extends WebChromeClient {
    //Handle javascript alerts:
    @Override
public boolean onJsAlert(WebView view, String url, String message, final Android.webkit.JsResult result)  
{
  Log.d("alert", message);
  Toast.makeText(context, message, 3000).show();
  result.confirm();
  return true;
};
...

および/または

public class MyWebViewClient extends WebViewClient {
@Override
    //Run script on every page, similar to Greasemonkey:
public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript:alert('hi')");
    }
...

ドキュメントに記載されている関数をオーバーライドし、onCreateでクライアントを次のように設定します。

webview.setWebViewClient(new MyWebViewClient());
webview.setWebChromeClient(new MyWebChromeClient());
86
NoBugs

あなたは両方のクライアントを同時に使用できます。両方が異なる機能を提供するので便利です。

たとえば、次のような場合:

  • 利用可能なブラウザを開くのではなく、Webビューでリダイレクトを追跡する

and

  • ロードの進行状況を追跡する

これは、クライアントの1つだけでは不可能です、次のことができます。

WebView webView = (WebView) findViewById(R.id.web_view);
webView.setWebViewClient(new WebViewClient());
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);

        // Your custom code.
    }
});

shouldOverrideUrlLoading(WebView、String) メソッドのデフォルト実装は、上記の場合にそのまま使用できます。他の動作が必要な場合を除き、オーバーライドする必要はありません。

6
Tomasz Dzieniak