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 ,可以采用FrameLayout 或者绝对布局都可

2. 有时候需要从h5中跳回到客户端的页面

这有两种方法。

第一种,拦截url

webview加载h5 新页面时,每次都会执行 shouldOverrideUrlLoading()方法,所以只要在这里拦截url,和服务端协定跳转到某个协议,然后不加载页面,直接跳到本地的activity。

  wev_web.setWebViewClient(new WebViewClient() {
                @Override   
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    if(url.contains("cmboa://go?url=settings")){         
                        Intent intent2 = new Intent(LoginWebviewActivity.this,SettingActivity.class);
                        startActivity(intent2);
                        return true;
                    }
                    view.loadUrl(url);
                    return true;
                }

第二种方法是 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);
                }
            });

以上代码 可以加载进度条。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值