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