Android WebView白屏解决方案
项目中 加载webview网页 偶尔链接会白屏 先说一下解决方案解决方案:mWebView.getSettings().setDomStorageEnabled(true);webview一些必要设置的属性//设置支持jswebSettings.setJavaScriptEnabled(true);//设置适应屏幕webSettings.setUseWideViewPort(true); //将图
项目中 加载webview网页 偶尔链接会白屏 先说一下解决方案
解决方案三种:
1、mWebView.getSettings().setDomStorageEnabled(true);
2、mWebView.getSettings().setPluginState(WebSettings.PluginState.ON);//设置是否支持插件
3、还有可能和缓存有关系 可以设置清理一下缓存
webView默认是不开启DOM Storage的,需要手动调用setDomStorageEnabled(true)来开启,只有开启了DOM Storage api后页面才能正常缓存一些数据
有可能是h5用了插件 要设置一下
什么是DOM Storage
HTML5 是下一代 HTML 标准,开始吸引越来越多人的目光。HTML5 的 DOM Storage 机制提供了一种方式让程序员能够把信息存储到本地的计算机上,在需要时获取。这点和 cookie 相似,区别是 DOM Storage 提供了更大容量的存储空间。
DOM Storage 分为 sessionStorage 和 localStorage。
localStorage 对象和 sessionStorage 对象使用方法基本相同,它们的区别在于作用的范围不同。sessionStorage 用来存储与页面相关的数据,它在页面关闭后无法使用。而 localStorage 则持久存在,在页面关闭后也可以使用。
webview一些必要设置的属性
//设置支持js
webSettings.setJavaScriptEnabled(true);
//设置适应屏幕
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
webSettings.setPluginState(WebSettings.PluginState.ON);//设置是否支持插件
webSettings.setSupportZoom(true); //支持缩放
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
//设置存储模式
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webSettings.setAllowFileAccess(true);
//setDomStorageEnabled解决了webview白屏问题 设置支持DomStorage
webSettings.setDomStorageEnabled(true);
//设置支持本地存储
webSettings.setDatabaseEnabled(true);
//设置缓存
webSettings.setAppCacheEnabled(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");
//下面三个各种监听
mWebView.setWebChromeClient(wcc);
mWebView.setDownloadListener(dl);
mWebView.setWebViewClient(wvc);
//加载连接
mWebView.loadUrl(XXXXXXXX);
Android WebView与h5的js方法交互:
1、设置支持js
webSettings.setJavaScriptEnabled(true);
2、注入 Java 对象到 WebView 中
binding.webView.addJavascriptInterface(getJavascriptObject(), "bridge");
注:Java 对象定义如下,需要特别注意的是,在 JELLY_BEAN_MR1 之后,只有 public 且添加了 @JavascriptInterface注解的方法才能被调用
private JavascriptObject getJavascriptObject(){
return new JavascriptObject();
}
public class JavascriptObject{
@JavascriptInterface
public final void showTitleBar(){
binding.webView.post((Runnable)(() -> {
binding.rlHeaderView.getRoot().setVisibility(View.VISIBLE);
}));
}
@JavascriptInterface
public final void getCurrentLocation(@NotNull final String jsCallback) {
binding.webView.post((Runnable)((Runnable) () -> {
CharSequence var1 = (CharSequence)jsCallback;
if (var1 != null && var1.length() != 0) {
binding.webView.loadUrl("javascript:window." + jsCallback);
}
}));
}
}
getCurrentLocation方法就是h5调用客户端的方法,jsCallback是客户端给h5的回调方法
更多推荐
所有评论(0)