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