Webview篇——统一封装

Android使用WebView混合开发时,就我个人而言一般就写一个WebActivity/WebFragment,将所有的业务逻辑封装在里面,如果不同业务逻辑多了就使用不同的BusinessManager管理起来,但是在特定的情况下还是需要使用多个WebView来展示Web界面的,例如虽然已经封装了WebActivity/WebFragment,但是如果要在LoginActivity/LoginFragment中显示一个用户协议Dialog,用户协议是由Web网页加载显示的,那么就需要另一个WebView来完成,那么为了减少重复代码就需要对WebView进行必要的封装。

WebView中一般有三部分需要进行设置、重写

  • WebView相关属性设置——Setting,例如是否自动加载图片、是否支持缩放等
  • WebVIew设置WebViewClient,完成网页控制、加载开始、加载结束、加载错误回调等
  • WebView设置WebChromeClient,完成进度获取、标题获取、弹框替换等

属性设置一般是通用的,特殊的可单独拿出来作为一个参数,若特殊参数多了可用方法的多态解决

public static void setWebView(@NonNull WebView webView,boolean isSupportJavaScript,boolean isSupportDom) {
        WebSettings settings = webView.getSettings();

        settings.setJavaScriptEnabled(isSupportJavaScript);
        settings.setDomStorageEnabled(isSupportDom);
        //TODO other setting
}

public static void setWebView(@NonNull WebView webView,boolean isSupportJavaScript,boolean isSupportDom) {
        setWebView(webView,isSupportJavaScript,true);//默认支持Dom
}

而对于WebViewClient和WebChromeClient中各回调方法不同业务有不同的处理逻辑,所以可以将各需要的方法通过接口回调拿出来,这样不同的业务就可实现不同的逻辑,看代码:

首先定义一个回调接口:

public interface ProviderCallback {

        void onPageStarted(WebView view, String url, Bitmap favicon);

        void onPageFinished(WebView view, String url);

        void onReceivedTitle(WebView view, String title);

       //TODO other impl
}

然后在相应的方法中回调:

           @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                if (callback != null) {
                    callback.onPageStarted(view, url, favicon);
                }
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                if (callback != null) {
                    callback.onPageFinished(view, url);
                }
            }

           @Override
            public void onReceivedTitle(WebView view, String title) {
                if (callback != null) {
                    callback.onReceivedTitle(view, title);
                }
            }

callback作为参数传入,整体代码结构:

public static void setWebView(@NonNull WebView webView, @Nullable ProviderCallback callback)//,other parameters
{
    //TODO impl
}

经过以上步骤就可实现WebView的统一封装以及不同业务实现不同的处理逻辑,读者有什么不同的观点,可留言大家共同交流!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 链接:https://www.jianshu.com/p/fd61e8f4049e 一、简介 这部分主要介绍下 W...
    柒黍阅读 1,999评论 0 4
  • Tips 由于WebView的用法实在太多,如果您只是想查询某个功能的使用——建议Ctrl+F(Commad+F)...
    BugDev阅读 7,914评论 11 109
  • 这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以...
    Shawn_Dut阅读 7,563评论 3 55
  • WebView·开车指南 2016-08-31BugDev 北京市东城区首席Bug布道师开山之作,一整月交通事故血...
    53c021c38a1d阅读 937评论 0 1
  • 杏仁儿把最后一块儿烤得焦黄的馒头咽下去,然后打了一个舒服的饱嗝。刚刚打扫干净的厨房因为突然想要吃东西再次变得一片狼...
    喜难症阅读 492评论 2 12

友情链接更多精彩内容