Являются ли WebViewClient и WebChromeClient взаимоисключающими?
отсюда объяснение о различиях между WebViewClient
и WebChromeClient
Кажется, что если вы используете один, вы не должны использовать другой (для того же объекта WebView).
правильно ли я понимаю?
если нет, то когда можно использовать оба WebViewClient
иWebChromeClient
для того же
2 ответа:
вы, конечно, можете использовать оба, они просто имеют разные функции. Настройка собственного пользовательского WebViewClient позволяет обрабатывать onPageFinished, shouldOverrideUrlLoading и т. д., WebChromeClient позволяет обрабатывать предупреждения 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) метод можно использовать как-есть для вышеупомянутого случая - нет необходимости переопределять его, если вы не хотите другого поведения.