最近使用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地址:
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);
}
});
以上代码 可以加载进度条。