美文网首页
Android中使用WebView遇到的问题总结

Android中使用WebView遇到的问题总结

作者: 馒头炖土豆 | 来源:发表于2018-11-14 16:36 被阅读11次
    
    Android中使用WebView遇到的问题总结:
    
    1:直接在xml中给webview设置了背景图片,背景图片不生效的问题
    解决方法:在xml中给webview设置背景图片,然后在代码中增加:webView.setBackgroundColor(0);
    
    2:点击h5中的按钮时,通过scheme跳转到Android原生界面
    a:具体的操作流程可以参考我朋友的文章:https://blog.csdn.net/m0_37700275/article/details/81386910
    
    b:问题一:7.0/8.0手机h5端的scheme和我这边的scheme完全一样,但是点击按钮不能跳转成功
       原因:我在代码中调用了以下代码:
            mWbAllFenqu.setWebViewClient(new WebViewClient()
            {
                @Override
                public void onPageFinished(WebView view, String url)
                {
                    super.onPageFinished(view, url);
                    LogUtils.i("onPageFinished");
                    dialogDismiss();
                }
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon)
                {
                    super.onPageStarted(view, url, favicon);
                    LogUtils.i("onPageStarted");
                    dialogShow();
                }
            });
        解释:我们是完全通过h5端控制跳转的,也就是说在Android端是不写跳转事件的,所以我在setWebViewClient()
        的时候,并没有重写shouldOverrideUrlLoading()方法,也没有在shouldOverrideUrlLoading()方法中根据点击
        h5按钮时的url进行页面跳转,而我之所以调用setWebViewClient()方法时想在h5页面开始加载时弹出加载框,在h5页面加载完成后加载框消失。
        如果想要在setWebViewClient()中控制页面跳转,可以这样写:
         mWbAllFenqu.setWebViewClient(new WebViewClient()
            {
                @Override
                public void onPageFinished(WebView view, String url)
                {
                    super.onPageFinished(view, url);
                    LogUtils.i("onPageFinished");
                    dialogDismiss();
                }
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon)
                {
                    super.onPageStarted(view, url, favicon);
                    LogUtils.i("onPageStarted");
                    dialogShow();
                }
                        @Override
                public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                    LogUtils.i("shouldOverrideUrlLoading");
                    LogUtils.i("request.toString():"+request.getUrl().toString());
                    Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
                    startActivity(intent);
                    return true;
                }
            });
        如果和我一样,在Android端只定义scheme,由h5端完全调用,而又想在页面加载过程中有加载框出现,页面加载完成后
        加载框消失,可以不调用setWebViewClient()方法,改成:
            dialogShow();
            webView.loadUrl(url);
            mWbAllFenqu.setWebChromeClient(new WebChromeClient()
            {
                public void onProgressChanged(WebView view, int progress)
                {
                    //当进度走到100的时候做自己的操作
                    if(progress == 100){
                        dialogDismiss();
                    }
                }
            });
    
    c:问题二:代码不走shouldOverrideUrlLoading()方法
       在重写shouldOverrideUrlLoading()方法时,我遇到了问题二,就是我点击h5中的按钮时并不走shouldOverrideUrlLoading()方法,
       这让我无比郁闷,后来尝试着把webView.loadUrl(url);放到setWebViewClient()方法的后面,竟然神奇的成功了,但是有些其他型号的手机
       这样做还是不走shouldOverrideUrlLoading()方法
    
    d:问题三:适配5.0/6.0手机
       当我在公司的7.0/8.0手机上完成页面显示和页面跳转的功能后,我给自己的6.0手机装了一个APK,发现6.0中h5页面中的所有按钮
       都挤到了左上角,于是又给5.0手机装了一个,也是一样的问题,后来经过不断调试,发现原因是:ES6的版本过高,将ES6改成ES5就没问题了。
    
    e:问题四:5.0手机的页面跳转问题
       当5.0/6.0手机的页面没问题之后,6.0可以通过scheme由h5端跳转到Android原生页面,
       但是5.0直接报错:TOPICID://aa.diqu:8888/test处的网页不能载入为:net::ERR_UNKOWN_URL_SCHEMW,
       于是改成使用setWebViewClient(),重写shouldOverrideUrlLoading()方法跳转,发现5.0的手机不走shouldOverrideUrlLoading()方法,
       于是改成以下方法:
       mWbAllFenqu.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onReceivedTitle(WebView view, String title) {
                    LogUtils.i("onReceivedTitle");
                    LogUtils.i("view.getUrl():"+view.getUrl());
                    String url = view.getUrl();
                    if (url.startsWith("topicid")) //只有是跳转到地区界面的时候,才进行跳转处理
                    {
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity(intent);
                    }
                }
                public void onProgressChanged(WebView view, int progress)
                {
                    //当进度走到100的时候做自己的操作
                    if(progress == 100){
                        dialogDismiss();
                    }
                }
            });
       
    总结:如果使用scheme从h5端跳转到Android原生界面,建议使用setWebChromeClient()方法,百分百没问题
       
      
    
    

    相关文章

      网友评论

          本文标题:Android中使用WebView遇到的问题总结

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