十一长假过来基本处于没啥事做的情况,所以没有做一些实际的开发,自己最近也在研究java的后台,自己写了一些简单的接口。好了,废话不多说。切入正题:
公司最近有个项目是web应用,需要发布安卓和ios两个平台的应用。所以我们安卓的任务量还是很轻的,主要是通过webview加载网页的url,安卓端需要做一些底层的东西。比如导航,视屏播放,还有第三方分享。
其中webview和js交互可以通过自定义接口和拦截url来实现,具体可以看我的上一篇博客:这里写链接内容。
但是我在此过程中遇到了一个很奇怪的问题,就是webapp中有一个跳转url ,跳转之后发现 html中的一些样式没有了,并且某些点击事件也没法触发了。很奇怪,但是这个webapp在网页端打开和在ios上这些样式显示正常,跳转也是正常。所以我怀疑是安卓端的webview的一些配置问题。找了很久发现加上这句就可以了。
//获取webview的配置
WebSettings settings = mWebView.getSettings();
//配置支持domstorage
settings.setDomStorageEnabled(true);
但这个配置具体有什么用了?我们可以看一下源码:
/**
* Sets whether the DOM storage API is enabled. The default value is false.
*
* @param flag true if the WebView should use the DOM storage API
*/
public synchronized void setDomStorageEnabled(boolean flag) {
throw new MustOverrideException();
}
看了一些感觉像是支持dom 的这个具体我也不清楚,网上搜了也没说这个是干啥的。但是就是能解决问题。所以很奇怪。记录一下,防止以后入坑。
我们平时webView 加载失败,比如网络不行了。但是这个时候加载的是默认的页面比较丑。我们可以自己写一个。只要重写onReceivedError()方法就可以了。
webview.setWebViewClient(new MonitorWebClient());
//继承WebViewClient 重写方法
public class MonitorWebClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// 错误<strong>处理</strong>
try {
webview.stopLoading();
} catch (Exception e) {
}
try {
webview.clearView();
} catch (Exception e) {
}
if (webview.canGoBack()) {
webview.goBack();
}
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
// 忽略证书的错误继续Load页面内容
handler.proceed();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
}
@Override
public void onPageFinished(WebView view, String url) {
}
}
我们webapp没法监听我们手机的返回键,所以我们得重写方法:这样就能实现按下返回键返回到上个页面
@Override
public void onBackPressed() {
//是否能返回
if(webview.canGoBack()){
webview.goBack();
return;
}else{
finish();
}
super.onBackPressed();
}
好了,webview的基本用法已经差不多了。以后有其他新的问题我再补充吧。
解决WebView样式丢失问题

本文介绍了一个关于WebView加载WebApp时出现样式丢失及点击事件失效的奇怪问题,并给出了通过启用DOM存储API解决该问题的方法。此外,还分享了自定义错误页面及监听返回键的具体实现。
2681

被折叠的 条评论
为什么被折叠?



