美文网首页Android与js交互
Webview篇——统一封装

Webview篇——统一封装

作者: lvTravler | 来源:发表于2019-08-11 13:39 被阅读0次

    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的统一封装以及不同业务实现不同的处理逻辑,读者有什么不同的观点,可留言大家共同交流!

    相关文章

      网友评论

        本文标题:Webview篇——统一封装

        本文链接:https://www.haomeiwen.com/subject/sbxqjctx.html