从这个关于两者之间差异的很好的解释看来,如果你使用一个,你不应该使用另一个(对于同一个 WebView 对象)。WebViewClient
WebChromeClient
我的理解正确吗?
如果不是,什么时候可以同时使用WebViewClient
和 WebChromeClient
用于同一个WebView
对象?
有没有一个例子说明只使用两者WebViewClient
和 WebChromeClient
用于同一个WebView
对象就可以实现某个目标?
从这个关于两者之间差异的很好的解释看来,如果你使用一个,你不应该使用另一个(对于同一个 WebView 对象)。WebViewClient
WebChromeClient
我的理解正确吗?
如果不是,什么时候可以同时使用WebViewClient
和 WebChromeClient
用于同一个WebView
对象?
有没有一个例子说明只使用两者WebViewClient
和 WebChromeClient
用于同一个WebView
对象就可以实现某个目标?
您当然可以同时使用两者,它们只是具有不同的功能。设置自己的自定义 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());
您可以同时使用两个客户端。它很有用,因为它们都提供了不同的功能。
例如,如果您想:
和
仅使用其中一个客户端是不可能的,您可以执行以下操作:
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)方法的默认实现可以按原样用于上述情况 - 除非您想要其他行为,否则无需覆盖它。