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