android webview 加载h5 相关问题

原创 2015年11月20日 10:49:24
                          **android webview 详解**
   最近使用webview 加载h5,进行开发。其中遇到诸多问题,一一介绍:
   1. webview 不会覆盖全屏,在屏幕下方会出现空白。解决方法: 网上给出方法,在manifest.xml中 加入
   <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:resizeable="true"
        android:anyDensity="true"/>
  以上语句的作用 是为我们的屏幕设置多分辨率支持。
  android:anyDensity = "" , 当值为 true 时,当应用程序安装在不同分辨率的手机上时,程序会分别加载 hdpi,mdpi,ldpi 文件夹中的资源。 相反,如果值设置为 false ,即使我们在 hdpi,mdpi,ldpi 文件夹下放有相同资源,应用也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高分辨率,以及低分辨率的手机上,比如说一部 240 × 320 像素的手机,如果设置 android:anyDensity = "false" , Android 系统会将 240 x 320( 低分辨率 ) 转换为   320 × 480( 中分辨率 ) ,这样的话,应用就会在低分辨率手机上加载 mdpi 文件中的资源。
    然后发现,并没有什么用,最后的解决方法是不要在线性布局或者相对布局中使用 webview ,可以采用framlayout 或者 绝对布局 都可。
 2. 有时候 需要从h5中跳回到客户端的页面,这有两种方法。第一种,拦截url,
   wev_web.setWebViewClient(new WebViewClient() {
                @Override     // cmbOA://go?url=gesture&username=xxx&usernum=xxx&moaurl=xxx&ss=xxx
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    LogUtils.defaultLog("url......" + url);
                    CookieManager cookieManager = CookieManager.getInstance();
                    String CookieStr = cookieManager.getCookie(url);
                    LogUtils.defaultLog("cookie...." + CookieStr);
                    if(url.contains("cmboa://go?url=settings")){         //cmbOA://go?url=settings
                        Intent intent2 = new Intent(LoginWebviewActivity.this,SettingActivity.class);
                        startActivity(intent2);
                    }
                    view.loadUrl(url);
                    return true;
                }
    webview加载h5 新页面时,每次都会执行 shouldOverrideUrlLoading()方法,所以只要在这里拦截url,和服务端协定跳转到某个协议,然后不加载页面,直接跳到本地的activity。
         第二种方法是 webview已经支持js,我也没使用这个方法,把简单demo介绍一下:
    myWebView = (WebView) findViewById(R.id.myWebView);
myWebView.getSettings().setJavaScriptEnabled(true);
// 与js交互,JavaScriptinterface 是个接口,与js交互时用到的,这个接口实现了从网页跳到app中的activity 
// 方法,特别重要
myWebView.addJavascriptInterface(new JavaScriptinterface(this),
"android");
// html里的内容,test1就是本地的html,在项目assets文件夹下
String htmlText = getFromAssets("test1.html");
// 将html里的内容加载到webview中
myWebView.loadData(htmlText, "text/html", "utf-8");
myWebView.setWebViewClient(new myWebViewClient());

html 代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript">   
function showAndroidToast() {       
android.showToast();   
}
</script>
</head>
<body>
<a href="#" id="a1" name="a1" onClick="showAndroidToast()">button</a>
<input type="button" value="Say hello"
onClick="showAndroidToast()"/> 
</body>
</html>
demo地址:http://download.csdn.net/detail/u012933335/9285237

3.cookie的问题。
  webview使用webkit的内核,如果需要保存cookie 需要执行以下方法:
     /**
     * 同步cookie
     * @param url
     */
   private  void syncCookie(String url){ //,String ss,String tokenId
       CookieSyncManager.createInstance(LoginWebviewActivity.this);
       CookieManager cookieManager = CookieManager.getInstance();
       String CookieStr = cookieManager.getCookie(url);
       LogUtils.defaultLog("1...cookie" + CookieStr);
       cookieManager.setCookie(url, CookieStr);
       CookieSyncManager.getInstance().sync();
   }
    以上方法 就可以同步webview 的cookie,但是有一个问题值得注意的是,不同的webview无法 同步cookie,也就是你新建一个webview 加载页面的话,cookie 是无法同步的,这是个比较头疼的问题,在本地和h5的跳转之间,始终只能用一个webview 加载,尤其是遇到自动登录的问题,需要设置许多逻辑,进行判断。网友如果有解决方法,可以在评论下告知我。

4  进度条
  wev_web.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onProgressChanged(WebView view, int newProgress) {
                    if (newProgress == 100) {
                        webProgressBar.setVisibility(View.GONE);
                    } else {
                        if (View.INVISIBLE == webProgressBar.getVisibility()) {
                            webProgressBar.setVisibility(View.VISIBLE);
                        }
                        webProgressBar.setProgress(newProgress);
                    }
                    super.onProgressChanged(view, newProgress);
                }
            });
  以上代码 可以加载进度条。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

对于android WebView加载不出Html5网页的解决方法

之前碰到一个问题,就是用webview去加载一个H5的页面,但是发现加载出现一片空白,但是我把我的链接放到浏览器里却又是可以的,找了会,被我老大叫过去搞别的了,然后被我老大找出来了,就是因为对某些标签...

webview部分内容偶尔加载不出来,html5在webview渲染问题

今天做项目时遇到webview部分内容偶尔加载不出来。 做的是一个抽奖的转盘,其中转盘部分是用h5的canvas写的,测试发现有部分有手机根本加载不出来(联想4.3),有的偶尔加载不出来(vivo5...

Android中webView加载H5绑定cookie

Android中webView加载H5绑定cookie 简介:          我最近在做项目的时候遇到了这种情况:1.需要用WebView实现一个H5的登陆注册。2.大赛报名,用H5实现。这些情...

android 的webView加载h5,和h5的交互(java和JavaScript的交互)

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。(通...

webview之加载H5界面无法调用手机本地图库

webview加载H5页面,如果H5界面需要调用手机的本地图库首先在此祝各位大佬远离BUG 比如我们在开发中会遇到这样的场景,需要加载一个H5界面,这个界面里面可能有用户上传头像这个功能,但是当你怎么...

webview 加载h5页面,播放视频+全屏,实现简单封装

前段时间项目中用到了h5。从目前的市场来看,原生和h5的结合受到很多公司的欢迎,刚好最近微信也推出了它自己的“小程序”,这在Android程序员之间也掀起了波澜,引起大家讨论。 个人觉得Googl...

iOS webView 远端h5优先加载本地资源

iOS UIWebView 远端h5优先加载本地资源,实现方法为通过对请求进行拦截

WebView加载H5页面及自动播放网页内置的音乐的方法

1.添加权限 2.布局文件3.简单的加载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)