android webview的使用
来源:互联网 发布:python自动化测试虫师 编辑:程序博客网 时间:2024/06/07 06:42
最近因公司需要使用了webview来加载网页。使用后我觉得有必要将注意点记录下来,以备不时之需。
首先:在对应活动中的xml里使用webview,在活动中得到webview的实例并加载url:webview.loadurl(url);这样运行出来过后就能看见你加载url的内容了,实际上webview加载数据大致分为几种:
1. 加载本地资源:webView.loadUrl("file:///android_asset/example.html");
2. 加载网络资源:webView.loadUrl("www.xxx.com/index.html");
3. 添加请求头信息:
Map<String,String> map=new HashMap<String,String>();
map.put("User-Agent","Android");
webView.loadUrl("www.xxx.com/index.html",map);
4.也可以加载html片段: String data = " Html 数据";webView.loadData(data, "text/html", "utf-8");
webview的常用设置:
1.支持JavaScript脚本:
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);//设置支持javascript
webView.addJavascriptInterface(new JavaScriptInterface(), "xueleapp");
JavaScriptInterface 接口定义:
public class JavaScriptInterface {
@android.webkit.JavascriptInterface
public void doTrainFinish() {
finish();
}
}
2.设置WebViewClient 主要辅助WebView处理各种通知、请求事件
比如要实现WebView中链接在WebView内部跳转 :
webView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
除此之外WebViewClient更多的处理网页的地址的解析和渲染,例如
onLoadResource//加载资源时响应
onPageStart//在加载页面时响应
onPageFinish//在加载页面结束时响应
onReceiveError//在加载出错时响应
onReceivedHttpAuthRequest//获取返回信息授权请求
3.设置WebChromeClient主要辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
比如加载进度获取titlewebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100) { //网页加载完成 } else { //网页加载中 } } });
除了上面检测进度之外还有
onCloseWindow//关闭WebView
onCreateWindow() //触发创建一个新的窗口
onJsAlert //触发弹出一个对话框
onJsPrompt //触发弹出一个提示
onJsConfirm//触发弹出确认提示
onProgressChanged //加载进度
onReceivedIcon //获取网页icon
onReceivedTitle//获取网页title其中在webview中点击上传图标弹出弹出框选择图片和拍照上传时,android5.0以上和以下的触发条件是不一样的。
4.)设置网页栈返回
webview会默认把浏览过去的网页进行压栈存储,所以我们有时需要实现回退到上一目录
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (webView.canGoBack()) { webView.goBack();//返回上一浏览页面 return true; } else { finish();//关闭Activity } } return super.onKeyDown(keyCode, event); }
5.)WebView 缓存控制
- LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
- LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
- LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
- LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
- LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
WebSettings webSettings = webView.getSettings();webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
6.)WebView屏幕自适应
WebSettings webSettings = webView.getSettings(); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true);7.)其他不常用设置
WebSettings webSettings =webView.getSettings();
webSettings.setSupportZoom(true);//支持缩放
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//支持内容重新布局
webSettings.supportMultipleWindows();//多窗口
webSettings.setAllowFileAccess(true);//设置可以访问文件
webSettings.setNeedInitialFocus(true);//当webview调用
requestFocus时为webview设置节点
webSettings.setBuiltInZoomControls(true);//设置支持缩放
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true);//支持自动加载图片
8.)硬件加速
开启硬件加速强制使用GPU渲染,确实给app流畅度带来不小的提升,但是在使用过程中遇见webview闪烁,也有导致加载webView黑屏或者白屏
解决办法:关闭硬件加速
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);这是把webview 中的硬件加速关闭。设置LAYER_TYPE_SOFTWARE后会把当前view转为bitmap保存。这样就不能开多个webview,否则会报out of memory。
需要在在webview中加入如下代码:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { invalidate(); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }9.)知识扩展WebViewJSBridge
虽然谷歌也提供了js与native函数互相调用的方式,但是通过addjavascriptInterface这种方式在Android 4.2以下版本存在一定的安全隐患,在Android 4.2以上也需要加@JavascriptInterface注解,否则无法调用。基于上面的原因建议学习一下
WebViewJSBridge这个比较不错的开源框架,地址:https://github.com/firewolf-ljw/WebViewJSBridge
10.解决webview不可见或者退出时正在播放的视频未停止:
@Override protected void onPause() { super.onPause(); webview.onPause(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { webview.onPause(); // 暂停网页中正在播放的视频 } }
@Override protected void onResume() { super.onResume(); webview.onResume(); }
本次总结和学习主要参考了:http://www.cnblogs.com/whoislcj/p/5645025.html,感谢原作者的成果。
- Android WebView的使用
- Android WebView的使用
- Android-WebView的使用
- android webview的使用
- android webview.的使用
- android WebView的使用
- Android webview的使用
- android webView的使用
- Android-WebView 的使用
- android webview的使用
- Android WebView的使用
- Android webview的使用
- Android WebView的使用
- Android webview的使用
- Android WebView的使用
- Android WebView 的使用
- android webview 的使用
- Android WebView的使用
- python 格式化输出
- spring boot 单个或多个文件上传
- 使用$http发送请求的时候显示loading
- Hive表操作及管理
- PyTorch(三)——使用训练好的模型测试自己图片
- android webview的使用
- win7系统注册表开机启动项如何打开?
- commit日志历史不一致的Git仓库合并
- viewpager中嵌套fragment实现联动
- opencv 特征点提取算法 SIFT SURF ORB FAST LBP学习(二)
- 数据库导出后的.SQL文件特别大,问题解决
- 让导航条的格式不随界面的变化而变化
- SOLID (object-oriented design)
- 图片处理线程异常终止