WebView简介
WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用WebKit渲染引擎加载显示网页
当前主流的浏览器内核
Trident Gecko WebKit Prosto
- 实例化WebView的对象
(1)webview=new WebView(context);
setContentView(webview);
(2)setContentView (R.layout.activity_java_call_javascript);
webview = (WebView) findViewById(R.id.webview); - 设置显示的网页
- webview.loadUrl
- webview.loadData
- webview.loadDataWithBaseURL
- 用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
//设置回退
//覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack(); //goBack()表示返回WebView的上一页面
return true;
}
return false;
} - 如果访问的页面中有Javascript,则webview必须设置支持Javascript。
WebSettings webSetting = webview.getSettings();
webSetting.setJavaScriptEnabled(true); 如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webview的WebViewClient对象。
webview.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。
webview.requestFocusFromTouch();原来是因为WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置WebView的DownloadListener,通过实现自己的DownloadListener来实现文件的下载。
1、设置WebView的DownloadListener:
webView.setDownloadListener(new MyWebViewDownLoadListener());2、实现MyWebViewDownLoadListener这个类,具体可以如下这样:
private class MyWebViewDownLoadListener implements DownloadListener {// 这只是调用系统中已经内置的浏览器进行下载,还没有WebView本身进行的文件下载
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,
long contentLength) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}}
WebSettings的常用方法介绍
setJavaScriptEnabled(true);
//支持js脚步
setPluginsEnabled(true);
//支持插件
3 setUseWideViewPort(false);
//将图片调整到适合webview的大小
4 setSupportZoom(true);
//支持缩放
5 setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
//支持内容从新布局
6 supportMultipleWindows();
//多窗口
7 setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//关闭webview中缓存
8 setAllowFileAccess(true);
//设置可以访问文件
9 setNeedInitialFocus(true);
//当webview调用requestFocus时为webview设置节点
webSettings.setBuiltInZoomControls(true);
//设置支持缩放
10 setJavaScriptCanOpenWindowsAutomatically(true);
//支持通过JS打开新窗口
11 setLoadsImagesAutomatically(true);
//支持自动加载图片
WebViewClient的方法全解
1 doUpdateVisitedHistory(WebViewview,Stringurl, boolean isReload)
(更新历史记录)
2 onFormResubmission(WebViewview,MessagedontResend,Messageresend)
(应用程序重新请求网页数据)
3 onLoadResource(WebViewview,Stringurl)
在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
4 onPageStarted(WebViewview,Stringurl,Bitmapfavicon)
这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告
诉用户程序在等待网络响应。
5 onPageFinished(WebViewview,Stringurl)
在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关
闭loading 条,切换程序动作。
6 onReceivedError(WebViewview, int errorCode, Stringdescription,StringfailingUrl)
(报告错误信息)
7 onReceivedHttpAuthRequest(WebViewview,HttpAuthHandlerhandler,Stringhost,
Stringrealm)(获取返回信息授权请求)
8 onReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror)
重写此方法可以让webview处理https请求。
9 onScaleChanged(WebViewview, float oldScale, float newScale)
(WebView发生改变时调用)
10 onUnhandledKeyEvent(WebViewview,KeyEventevent)
(Key事件未被加载时调用)
11 shouldOverrideKeyEvent(WebViewview,KeyEventevent)
重写此方法才能够处理在浏览器中的按键事件。
12 shouldOverrideUrlLoading(WebViewview,Stringurl)
在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做 很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
显示视图
1.loadUrl
1 网络内容
LoadUrl直接显示网页内容(单独显示网络图片)
2APK包内文件
LoadUrl显示APK中Html和图片文件
(1)把网页写在工程根目录下的assets目录下
webview.loadUrl(“file:///android_asset/JavaCallJS1.html”);
(2)网页
webview.loadUrl(“http://10.0.2.2:8080/JavaCallJS1.html“);
2. webview.loadData
1 网络内容
LoadData显示中文网页内容(含空格的处理)
2APK包内文件
LoadData(loadDataWithBaseURL)显示APK中图片和文字混合的Html内容
注意 :
css中经常用’#’, ‘%’, ‘\’,’?’等字符,我们需要用UrlEncoder编码为%23, %25, %27, %3f 。loadData()中的html data中不能包含’#’, ‘%’, ‘\’, ‘?’四中特殊字符,出现这种字符就会出现解析错误,显示找不到网页还有部分html代码。
- webview.loadDataWithBaseURL
data为string类型的html代码
1 webView.loadData(URLEncoder.encode(data, “utf-8”), “text/html”, “utf-8”);
这样一些背景效果什么的都不怎么好看了。不推荐。
2 webView.loadDataWithBaseURL(null,data, “text/html”, “utf-8”, null);
这样就会完美解析了。
java调用js
webview.loadUrl(“javascript:javaCallJs()”);
javaCallJs()//是
<script type="text/javascript">
function javaCallJs(){
document.getElementById("content").innerHTML +=
"<br\>java调用了js无参函数";
}
</script>
js调用Java
// “android”是与js对应的Key
1 webview.addJavascriptInterface(new Video(), “android”);
private class Video {
@JavascriptInterface//必须加注解
public void playVideo(int itemid, String videourl, String itemtitle) {
// 把系统所有的播放调起来
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(videourl), “video/*”);
startActivity(intent);
}
}
2 webView.addJavascriptInterface(getHtmlObject(), “android”);
private Object getHtmlObject() {
Object insertObj = new Object() {
public void JavacallHtml() {
runOnUiThread(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript: showFromHtml()");
Toast.makeText(JavaCallJSActivity2.this, "clickBtn",
Toast.LENGTH_SHORT).show();
}
});
return insertObj;
}
}
http://blog.csdn.net/u011415782/article/details/21782273
http://www.360doc.com/content/14/0611/13/15210553_385676271.shtml
http://blog.csdn.net/i_lovefish/article/details/8124807