一、WebView简介:
WebView组件本身是一个浏览器,它的内核基于开源WebKit引擎。Android系统自带的浏览器也是基于WebKit引擎实现。
二、WebView加载网页:
1.WebView的loadUrl(String url)方法的使用:
webView.loadUrl(String url) ; //加载指定URL的页面。
webView.loadUrl("file:///android_asset/test.html"); //加载assets文件夹下的HTML页面。
webView.loadUrl("file:///mnt/sdcard/test.html"); //加载SD卡下的HTML文件。
如果test.html中有中文,则需要在html中设置下面的头字段,并保存为utf-8格式,否则会乱码。
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
2.WebView的loadData()与loadDataWithBaseURL()的使用:
① loadData(String data,String mimetype.String encoding) :
webView.loadData(htmlString,"text/html","utf-8"); //会出现中文乱码
解决方法:
webView.loadData(htmlString,"text/html;charset=utf-8",null); //无中文乱码
webView.loadDataWithBaseURL(null, htmlString,"text/html", "utf-8", null); //无中文乱码
②loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl):
String baseURL="file:///mnt/sdcard/";
String html="<html><body>"
+"<h2> image from sdcard :</h2><br> "
+"<h3>加载HTML文件</h3>"
+"<img src='capture.jpg' />"
+"</body></html>";
//加载相对于根baseURL下的数据,capture.jpg保存在/mnt/sdcard/目录下
webView.loadDataWithBaseURL(baseURL, html, "text/html", "utf-8", null);
//当test.html与html内容相同时,效果一样,capture.jpg保存在/mnt/sdcard/目录下
webView.loadUrl("file:///mnt/sdcard/test.html");
③两个方法的区别:
loadData():不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使loadDataWithBaseURL,刷新时从缓存区读取。
loadDataWithBaseURL():能加载图片,如果不传入URL,则刷新时会造成白屏,刷新时调用的是reLoad()方法,会重新加载URL,不传入URL时,默认是空。
三、使用WebView截取当前显示的页面:
1.截图当前WebView显示的内容,并将图片输出到相应的文件夹中。
Picture picture =webView.capturePicture(); //截取当前webView显示的内容
int width =picture.getWidth(); //得到图片的宽、高
int height=picture.getHeight();
if(width>0 && height>0){
//创建指定宽高的BItmap
Bitmap bitmap =Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas =new Canvas(bitmap); //以固定大小的bitmap创建画布
picture.draw(canvas); //将picture画在canvas上
//打开/data/data/包名/files文件下的输出流
FileOutputStream fos =openFileOutput("capture.jpg", Context.MODE_PRIVATE);
//或者打开SD卡的输出流
File file =new File(Environment.getExternalStorageDirectory(),"capture.jpg");
//String filePath=Environment.getExternalStorageDirectory().getPath()+"/capture.jpg";
FileOutputStream fos =new FileOutputStream(file);
// FileOutputStream fos =new FileOutputStream(filePath);
//压缩bitmap到输出流,PNG代表无损的,90代表图片质量,数值越大质量越高。
bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.close();
四、使用WebView处理页面浏览。
1.WebSettings setting =webView.getSettings();
setting.setSupportZoom(true); //设置支持缩放
setting.setBuiltInZoomControls(true); //设置内置缩放装置
setting.setJavaScriptEnabled(true); //设置JavaScript能调用Android方法
webView.goBack(); //后退
webView.goForward(); //前进
webView.canGoBack(); //是否能后退
webView.canGoForward(); //是否能前进
webView.zoomOut(); //缩小网页
webView.zoomIn(); //放大网页
webView.requestFocus(); //获取焦点
webView.clearHistory(); //清除历史记录
webView.clearCache(boolean includeDiskFiles); //清楚缓存
webView.destroy(); //销毁WebView
2. WebViewClient:
当事情发生,影响呈现的内容,例如,错误或表单提交,也可以拦截URL加载。
//打开网页时,覆盖而不是打开新的窗口
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true; //返回true,处理此事件
}
//覆盖返回键,如果不覆盖返回键,则按返回时会退出整个WebView。
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
if(event.getKeyCode()==KeyEvent.KEYCODE_BACK){
if(view.canGoBack()){
view.goBack(); //后退
}
}
return true;
}
});
3. WebChromeClient:
这个类会影响浏览器用户界面发生的事情,例如,进度更新和JavaScript发送警报。
//设置窗口的进度条,范围from 0 to 10000
getWindow().requestFeature(Window.FEATURE_PROGRESS);
//requestWindowFeature(Window.FEATURE_PROGRESS);
webView.setWebChromeClient(new WebChromeClient(){
//当WebView的进度改变时更新窗口进度条
@Override
public void onProgressChanged(WebView view, int newProgress) {
//Activity的进度范围是0-10000,newProgress是0-100
MainActivity.this.setProgress(newProgress*100);
}
});
五、使用WebView与JavaScript进行交互:
①
开启JavaScript调用:
webView.getSettings()
.setJavaScriptEnabled(true);
②将MyObject对象暴露给JavaScript:
webView.addJavascriptInterface(new MyObject(this), "js");
③在被调用的方法上添加: @JavascriptInterface 。
简单的示例:
public class MainActivity extends Activity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView=(WebView) findViewById(R.id.webView);
//加载assets文件夹下的HTML页面
webView.loadUrl("file:///android_asset/test.html");
//得到WebSettings对象
WebSettings setting =webView.getSettings();
//开启JavaScript调用
setting.setJavaScriptEnabled(true);
//设置默认utf-8格式
setting.setDefaultTextEncodingName("utf-8");
setting.setDefaultTextEncodingName("utf-8");
//将MyObject对象暴露给JavaScript
webView.addJavascriptInterface(new MyObject(this), "js"); //方法一
webView.addJavascriptInterface(new Object(){ //方法二:
@JavascriptInterface //只需要在被调用的方法上添加
public void showToast(String name){
Toast.makeText(MainActivity.this, name+",您好!", Toast.LENGTH_SHORT).show();
}
public void showDialog(){
final String [] str ={"张三","李四","王五"};
new AlertDialog.Builder(MainActivity.this).setTitle("姓名列表")
.setIcon(R.drawable.ic_launcher).setItems(str, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "您点击了"+str[which], Toast.LENGTH_SHORT).show();
}
}).setPositiveButton("确定", null).create().show();
}
},"js1");
}
/**
*
* 自定义类
*/
class MyObject {
private Context context;
public MyObject(Context context){
this.context=context;
}
/**
* 显示吐司
* @param name
*/
@JavascriptInterface
public void showToast(String name){
Toast.makeText(context, name+",您好!", Toast.LENGTH_SHORT).show();
}
/**
* 显示姓名列表
*/
@JavascriptInterface
public void showDialog(){
final String [] str ={"张三","李四","王五"};
new AlertDialog.Builder(context).setTitle("姓名列表")
.setIcon(R.drawable.ic_launcher).setItems(str, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "您点击了"+str[which], Toast.LENGTH_SHORT).show();
}
}).setPositiveButton("确定", null).create().show();
}
}
}
test.html 代码:需要保存为utf-8格式,否则中文乱码。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
<input type="button" value="showToast" οnclick="js.showToast('张三');" />
<input type="button" value="showDialog" οnclick="js.showDialog();" />
<input type="button" value="showToast" οnclick="js1.showToast('李四');" />
</body>
</html>