就目前而言,如何应对版本的频繁更新呢?又如何灵活多变的展示我们的界面呢?这又涉及到了web app与native app之间的孰优孰劣的争论。我认为分不出个123来,未来一定是混合型app的世界。如淘宝商城首页的活动页面,京东商城里,我们都可以见到web页与native页的混合,即利用了web app的灵活易更新,也借助了native本身的效率。最近我们的项目里也是出现了大量的web页。所以我把webview的使用与在使用过程中遇到的问题拿出来大家一起分享下。
1,简单用法
网络用:
webView.loadUrl("http://www.baidu.com");
本地文件用:
webView.loadUrl(file:///android_asset/XXX.html);
这里的格式是固定的,文件位置 assets目录下, 这样,就能加载一个网页了。
2,当然,我们并不仅限于它的简单使用。如果访问的页面中有javaScript,则webview必须设置支持JavaScript
webView.getSettings().setJavaScriptEnabled(true);
3,缓存的使用
//优先使用缓存 webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //不使用缓存 webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);如果webview变化大的话建议不用缓存,以防状态改变,没有刷新界面。
4,设置WebView可触摸放大缩小:
webview.getSettings().setBuiltInZoomControls(true);
5,WebView双击变大,再双击后变小,当手动放大后,双击可以恢复到原始大小,如下设置:
webView.getSettings().setUseWideViewPort(true);
6,在程序内打开网页
webView.setWebViewClient(new WebViewClient() {@Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { view.setVisibility(View.GONE); //在这里我们可以设置一下加载网页失败时的提示 Toast.makeText(Activity.this, "网络服务不可用", Toast.LENGTH_SHORT).show(); }
@Override
public booleanshouldOverrideUrlLoading(WebView view, String url){
Toast.makeText(getApplicationContext(),"WebViewClient.shouldOverrideUrlLoading", Toast.LENGTH_SHORT).show();
//使用自己的WebView组件来响应Url加载事件,而不是使用默认浏览器器加载页面
view.load(url);
//记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止吧,事件就会不会冒泡传递了,
我们称之为消耗掉
//在这里我们就可以对url进行截取,判断,来与网页交互。例如点击网页上的button跳转本地页面
return true;
}
)
onLoadResource:加载资源时响应
onPageStart:在加载页面时响应
onPageFinish:在加载页面结束时响应
onReceiveError:在加载出错时响应
了解了这些,我们就可以在特定的时间段里做特定的事情了。
7,WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如 onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert无效,需要定制WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
看上去它和webviewClient有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。
8,post方式传递数据
String postData = "clientID = cid & username = name"; webview.postUrl(url, EncodingUtils.getBytes(postData, "base64"));
9,按返回键时, 不退出程序而是返回上一浏览页面:
public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }