WebViewClient和WebChromeClient是否互斥?


70

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

我的理解正确吗?

如果没有,一个人何时会同时使用WebViewClient WebChromeClient用于同一WebView物体?

有没有这样的情况示例,仅对同一对象同时使用WebViewClient 可以实现特定目标?WebChromeClientWebView

Answers:


90

您当然可以同时使用这两种功能,它们只是功能不同。设置自己的自定义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());

我真正的意思的一个例子的情况,而不是代码。:)接受,除非有更好的答案。
ef2011 2011年

37
@ ef2011:假设您要将包含视频的页面加载到您的Web视图中。但是页面由htaccess文件保护。因此,要进行身份验证,您需要使用setWebViewClient并使用您的凭据覆盖其onReceivedHttpAuthRequest()方法。然后您想播放视频...。但是事实证明视频不播放!也许是通过JS控制的。或者它需要一个插件。因此,为了充分利用内容和更好的JS支持,您还需要setWebChromeClient()。我的观察方式:setWebViewClient用于基本的HTTP浏览器,setWebChromeClient用于与内容相关的操作和支持。
user1207504

2
我同意@ ef2011。此注释比上面的代码示例更清楚。
Chandranshu 2014年

也许有点晚了,但是我提供了另一个用例。:)
Tomasz Dzieniak

我想知道为什么Android团队不以简单,清晰和可理解的方式记录这些内容。
Kifayat乌拉

7

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

例如,如果您想:

  • 在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)方法的默认实现可以按原样使用-除非您希望其他行为,否则无需重写它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.