WebViewClient和WebChromeClient是互斥的吗?

ef2*_*011 66 android webview webviewclient webchromeclient

从这个很好的解释有关之间的差异WebViewClient,并WebChromeClient似乎如果你使用一个,你不应该使用其他的(对于相同的WebView对象).

我的理解是否正确?

如果没有,何时会同时使用WebViewClient WebChromeClient同一个WebView对象?

是否存在仅使用两者WebViewClient WebChromeClient同一WebView对象才能实现某个目标的情况的示例?

NoB*_*ugs 86

你当然可以使用它们,它们只是具有不同的功能.设置自己的自定义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;
};
...
Run Code Online (Sandbox Code Playgroud)

和/或

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')");
    }
...
Run Code Online (Sandbox Code Playgroud)

只需覆盖文档中描述的功能,然后在onCreate中设置客户端:

webview.setWebViewClient(new MyWebViewClient());
webview.setWebChromeClient(new MyWebChromeClient());
Run Code Online (Sandbox Code Playgroud)

  • @ ef2011:假设您想将包含视频的页面加载到您的webview中.但该页面由htaccess文件保护.因此,要进行身份验证,您需要使用setWebViewClient并使用ur凭据覆盖onReceivedHttpAuthRequest()方法.然后你想播放视频....但事实证明视频不播放!也许它通过JS控制.或者它需要一个插件.因此,为了充分利用内容和更好的JS支持,您还需要设置WebChromeClient().我看待它的方式:setWebViewClient用于基本的HTTP浏览器,setWebChromeClient用于与内容相关的操作和支持. (36认同)
  • 我同意@ ef2011.这个评论比上面的代码示例更清晰. (2认同)

Tom*_*iak 6

可以同时使用两个客户端.它很有用,因为它们都提供不同的功能.

例如,如果您想:

  • 在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.
    }
});
Run Code Online (Sandbox Code Playgroud)

由于shouldOverrideUrlLoading(WebView,String)方法的默认实现可以按原样用于上述情况 - 除非您想要其他行为,否则无需覆盖它.