android webView 加载webapp 一些问题与技巧

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

十一长假过来基本处于没啥事做的情况,所以没有做一些实际的开发,自己最近也在研究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的基本用法已经差不多了。以后有其他新的问题我再补充吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值