Являются ли WebViewClient и WebChromeClient взаимоисключающими?

отсюда объяснение о различиях между WebViewClient и WebChromeClient Кажется, что если вы используете один, вы не должны использовать другой (для того же объекта WebView).

правильно ли я понимаю?

если нет, то когда можно использовать оба WebViewClient и WebChromeClient для того же

2 ответов


вы, конечно, можете использовать оба, они просто имеют разные функции. Настройка собственного WebViewClient позволяет обрабатывать onPageFinished, shouldOverrideUrlLoading и т. д., WebChromeClient позволяет обрабатывать alert() Javascript и другие функции.

просто сделать свой собственный класс, например:

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());

вы можно использовать как клиентов одновременно. Это полезно, поскольку оба они обеспечивают различные функциональные возможности.

например, если вы хотите:

  • следуйте перенаправлениям в веб-представлении, а не открывая доступный браузер

и

  • отслеживать ход загрузки

которые невозможны только с одним из клиентов вы можете сделать следующий:

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) метод можно использовать как-для вышеупомянутого случая - нет необходимости переопределять его, если вы не хотите другого поведения.