WebViewClient和WebChromeClient是否互斥?

问题描述

| 从关于
WebViewClient
WebChromeClient
之间差异的出色解释看来,如果您使用一个,则不应使用另一个(对于同一WebView对象)。 我的理解正确吗? 如果不是,那么何时将
WebViewClient
WebChromeClient
同时用于同一个
WebView
对象? 有没有这样的情况的示例,即仅将ѭ0和ѭ1都用于同一个
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());
    ,        您可以同时使用两个客户端。这是有用的,因为它们两者都提供了不同的功能。 例如,如果您想: 在Web视图中遵循重定向,而不是打开可用的浏览器 和 跟踪加载进度 仅使用其中一个客户端是不可能的,您可以执行以下操作:
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)方法的默认实现可以按原样使用-除非您希望其他行为,否则无需重写它。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...