Являются ли WebViewClient и WebChromeClient взаимоисключающими? - PullRequest
63 голосов
/ 25 июня 2011

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

Правильно ли мое понимание?

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

Есть ли пример ситуации, когда использование только WebViewClient и WebChromeClient для одного и того же WebView объекта могло бы достичь определенной цели?

Ответы [ 2 ]

84 голосов
/ 25 июня 2011

Вы, конечно, можете использовать оба, они просто имеют разные функции. Установка собственного пользовательского 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());
6 голосов
/ 08 июля 2016

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

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

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

и

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

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

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

...