代码之家  ›  专栏  ›  技术社区  ›  Pentium10

setwebviewclient和setwebchromeclient有什么区别?

  •  199
  • Pentium10  · 技术社区  · 14 年前

    有什么区别吗 setWebViewClient VS setWebChromeClient 在Android中?

    2 回复  |  直到 6 年前
        1
  •  132
  •   Sandeep Yohans Paulo Fidalgo    6 年前

    source code :

    // Instance of WebViewClient that is the client callback.
    private volatile WebViewClient mWebViewClient;
    // Instance of WebChromeClient for handling all chrome functions.
    private volatile WebChromeClient mWebChromeClient;
    
    // SOME OTHER SUTFFF.......
    
    /**
     * Set the WebViewClient.
     * @param client An implementation of WebViewClient.
     */
    public void setWebViewClient(WebViewClient client) {
        mWebViewClient = client;
    }
    
    /**
     * Set the WebChromeClient.
     * @param client An implementation of WebChromeClient.
     */
    public void setWebChromeClient(WebChromeClient client) {
        mWebChromeClient = client;
    }
    

    使用WebChromeClient可以处理JavaScript对话框、Favicons、标题和进度。看看这个例子: Adding alert() support to a WebView

    乍一看,差异太多了 WebViewClient 和; WebChromeClient . 但是,基本上:如果您正在开发一个不需要太多功能但呈现HTML的WebView,那么您可以使用 WebViewClient . 另一方面,如果要(例如)加载正在呈现的页面的Favicon,则应使用 WebChromeClient 对象并重写 onReceivedIcon(WebView view, Bitmap icon) .

    大多数时候,如果你不想担心这些事情…你可以这样做:

    webView= (WebView) findViewById(R.id.webview); 
    webView.setWebChromeClient(new WebChromeClient()); 
    webView.setWebViewClient(new WebViewClient()); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.loadUrl(url); 
    

    而且你的WebView(理论上)将实现所有功能(作为Android本机浏览器)。

        2
  •  47
  •   Maytham Fahmi    6 年前

    我觉得这个问题需要更多的细节。我的答案来自于Android编程,书呆子牧场指南(第二版)。

    默认情况下 ,WebView中的javascript已关闭。你并不总是需要打开它,但对于某些应用程序,可能确实需要它。

    加载URL必须在配置WebView之后完成,所以最后要这样做。在此之前,通过调用 getSettings() 获取Websettings和调用的实例 WebSettings.setJavaScriptEnabled(true) . Websettings是您可以修改WebView的三种方法中的第一种。它有各种可以设置的属性,如用户代理字符串和文本大小。

    之后,配置WebViewClient。WebViewClient是一个事件接口。通过提供自己的WebViewClient实现,您可以响应呈现事件。例如,您可以检测渲染器何时开始从特定的URL加载图像,或者决定是否向服务器重新提交POST请求。

    WebVIEW客户端 有许多方法可以重写,其中大多数方法您将无法处理。但是,您确实需要替换默认的WebViewClient实现 shouldOverrideUrlLoading(WebView, String) . 此方法确定在WebView中加载新的URL时会发生什么,例如通过按链接。如果你返回true,你是说,不要处理这个url,我自己处理它。如果你返回false,你是说,继续加载这个url,webview,我不做任何事情。_

    与前面一样,默认实现使用URL触发一个隐式意图。但现在,这将是一个严重的问题。一些Web应用程序所做的第一件事是将您重定向到该网站的移动版本。对于默认的WebViewClient,这意味着您将立即被发送到用户的默认Web浏览器。这正是你想要避免的。 修复很简单,只需覆盖默认实现并返回false。

    使用WebChromeClient来美化事物 由于您要花时间创建自己的WebView,请添加一个进度条并使用加载页面的标题更新工具栏的副标题,让___

    要连接ProgressBar,您将使用WebView上的第二个回调: WebChromeClient .

    WebViewClient是一个响应渲染事件的接口;WebChromeClient是一个事件接口,用于响应应更改浏览器周围Chrome元素的事件。这包括javascript警报、favicons,当然还有加载进度和当前页面标题的更新。

    把它挂起来 onCreateView(…) . 使用WebChromeClient来美化环境 进度更新和标题更新都有自己的回调方法, onProgressChanged(WebView, int) onReceivedTitle(WebView, String) . 从中获得的进展 OnProgressChanged(Web视图,int) 是0到100之间的整数。如果是100,你知道 页面已完成加载,因此通过将进度栏的可见性设置为 View.GONE .

    免责声明: 这些信息是从Android编程中获得的:大书呆子牧场指南,获得了作者的许可。为了更多 有关本书的信息或购买副本,请访问 Bignerdranch.com.