webview的简单总结(最近面试遇到好多这方面的问题)
来源:互联网 发布:访客网络开启还是关闭 编辑:程序博客网 时间:2024/05/16 07:14
在Android中有WebView Widget,它内置了WebKit引擎,同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源的浏览器引擎,Chrome浏览器也是基于它的。所以很多表现WebView和Chrome是一样的。
在使用WebView之前,要在AndroidManifest.xml中添加 如下权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
否则会出Web page not available错误。
1 . 加载网页:
网络用:webView.loadUrl("http://www.baidu.com");
本地文件用:webView.loadUrl(file:///android_asset/XXX.html);这里的格式是固定的,文件位置 assets目录下
webview.postUrl(String url, byte[] postData) 加载页面使用Post方式,postData为参数
- // post方式传送参数
- // String postData = "clientID = cid & username = name";
- // webview.postUrl(url, EncodingUtils.getBytes(postData, "base64"));
2. 使用loadData方法来加载html数据
loadData()需要三个参数: HTML TAG ,MIME类型(text/html), 网页编码方式(utf-8).
使用它时可能会发现有如下问题:
I. loadData不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使用loadDataWithBaseURL。
II .使用loadData方法显示乱码。那是因为编码器设置错误导致的。我们知道String类型的数据主要是unicode编码,而WebView一般为了节省资源使用的是UTF-8编码,所以我们在loadData的时候要告诉方法怎样转码。即要告诉它要将unicode编码的内容转成UTF-8编码的内容。有些朋友虽然在loadData的时候设置了编码方式,但是还是显示乱码,这是因为还需要为WebView的text编码指定编码方式.
- WebView wv = (WebView)findViewById(R.id.webview) ;
- String content = getUnicodeContent() ;
- wv.getSettings().setDefaultTextEncodingName(“UTF -8”) ;
- wv.loadData(content, “text/html”, “UTF-8”) ;
WebView默认是不支持JavaScript 、IFrame或者是任何的框架语法的。通过设webview.getSettings().setJavaScriptEnabled(true); 就可以打开JavaScript. webView.requestFocus()如果不设置的话,会出现不能弹出软键盘等问题。
3. setScrollBarStyle 设置滚动条风格
webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);在内容显示内部显示
4. ClearCache 清除缓存内容
5. goBcak canGoBack goForward canGoForward
6. webView.stopLoading()停止加载页面
7. WebViewClient 和 WebChromeClient 区别
WebView主要负责解析渲染,WebViewClient 和WebChromeClient是用来辅助WebView。
WebViewClient主要帮助WebView处理各种通知、请求事件的,比如:
onLoadResource
onPageStart
onPageFinish
onReceiveError
- //受到错误时触发,比如400错误,这些错误一般都是无法补救的,最多给出提示信息
- @Override
- public void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {
- // TODO Auto-generated method stub
- super.onReceivedError(view, errorCode, description, failingUrl);
- }
onReceivedHttpAuthRequest
WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert,Prompt,Confirm无效,需要定制WebChromeClient处理弹出,从而获取网页中的JS,比如使用AlertDialog进行显示),可以参考 http://618119.com/archives/2010/12/20/199.html
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
看上去他们有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。更多的时候,你可以这样
WebView webView;
webView= (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());//.希望点击链接继续在当前browser中响应,必须覆盖 WebViewClient对象。
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
这样你的WebView理论上就能有大部分需要实现的特色了。
- webview.setWebChromeClient(new MyWebChromeClient());
- webview.setWebViewClient(new WebViewClient()
- {
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- // TODO Auto-generated method stub
- // return super.shouldOverrideUrlLoading(view, url);
- view.loadUrl(url);
- return true;
- }
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- // TODO Auto-generated method stub
- super.onPageStarted(view, url, favicon);
- mProgressDialog.show();
- }
- @Override
- public void onPageFinished(WebView view, String url) {
- // TODO Auto-generated method stub
- super.onPageFinished(view, url);
- mProgressDialog.hide();
- }
- });
- private class MyWebChromeClient extends WebChromeClient
- {
- @Override
- public void onReceivedTitle(WebView view, String title) {
- // TODO Auto-generated method stub
- super.onReceivedTitle(view, title);
- textview.setText(title);
- }
- }
8. JS使用
webview.addJavascriptInterface(new JavaScriptInterfaceDemo( this ), "JSInterfaceDemo");
//JSInterfaceDemo其实就是JavaScriptInterfaceDemo的别名,供HTML调用时使用
addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName,比如说JSInterfaceDemo,作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.JSInterfaceDemo访问到绑定的java对象了。在HTML中如何调用呢,"window.JSInterfaceDemo.getResposeCode() " 其中getResposeCode需要在JavaScriptInterfaceDemo中实现
需要注意的是:addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。
- public class JavaScriptInterfaceDemo
- {
- public void getResposeCode(final String msg)
- {
- mHandler.post(new Runnable()
- {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- }
- }
- }
- webview的简单总结(最近面试遇到好多这方面的问题)
- 【Java面试最近遇到的问题总结】
- 总结一下最近面试遇到的一些问题吧
- 最近面试java遇到的高频问题总结
- 面试遇到的问题总结(一)
- 遇到的面试问题总结
- 最近遇到的一些小问题总结
- 最近遇到的安卓问题总结
- 最近使用mybatis遇到的问题总结
- 最近遇到的一些问题总结
- 总结最近一周遇到的开发问题.
- go语言 最近遇到的问题总结
- 最近的面试总结
- 最近面试遇到的几个问题
- 一个group的问题,遇到好多次
- 最近遇到的问题
- 最近遇到的问题
- 最近遇到的问题
- java学习笔记(2)
- java 集合 collection内容总结
- Java内存区域和内存溢出异常(深入理解Java虚拟机)
- .NET 中的 async/await 异步编程
- EditText常用属性【二】:为文本输入框指定软键盘类型和软键盘回车键图标设置
- webview的简单总结(最近面试遇到好多这方面的问题)
- va_start和va_end使用详解
- IOS编程学习:property、nonatomic, retain,weak,strong用法
- 【12c新特性】12c中如何自动启动PDB Pluggable Database
- Redis基础
- 1013
- 服务端判断苹果内容是否支付完成(二)
- Oracle存储过程基本语法介绍-存储过程
- EditText常用属性【一】:空白提示/文本域/特殊字符/数字类型/等属性设置