WebView
1、概念
WebView是Android种基于webkit内核浏览器渲染引擎的组件,它可以通过HTML显示方便地网页。
2、权限
WebView需要添加网络权限:<uses-permission android:name="android.permission.INTERNET" />
3、属性
1)想和Js进行交互?那么加上
mWebView.getSettings().setJavaScriptEnabled(true);
2)想让WebView适应屏幕大小?那么加上
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setLoadWithOverviewMode(true);
3)WebView不支持缩放?那么加上
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.getSettings().setSupportZoom(true);
4)WebView显示乱码?重新设置一下编码吧!
mWebView.getSettings().setDefaultTextEncodingName("UTF-8");
5)WebView显示空白?开启或关闭硬件加速试一下吧,你会有惊喜的!
mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE,
null); // 加上关闭,默认开启
6)WebView不显示网络图片?阻碍了吧,放开吧!
mWebView.getSettings().setBlockNetworkImage(false);
// true是锁定哦
7)WebView打不开窗口?那么打开 试一试!
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
常用的属性就是这些啦,如果需要一些偏僻的,那就爱莫能助咯!
4、WebViewClient
WebViewClient处理各种通知,请求事件。
wv.setWebViewClient(new
WebViewClient(){
@Override
public
boolean shouldOverrideUrlLoading(WebView view, String url) {
//
如果你想打开的页面在webview中,不要犹豫了,copy吧!
view.loadUrl(url);
return
true;
}
@Override
public
void onPageStarted(WebView view, String url, Bitmap favicon) {
//
只要页面开始加载,我都监视的到
super.onPageStarted(view,
url, favicon);
}
@Override
public
void onPageFinished(WebView view, String url) {
//
略坑,到了这里还真不一定加载结束呢!
super.onPageFinished(view,
url);
}
@Override
public
void onReceivedError(WebView view, int errorCode,
String
description, String failingUrl) {
//
TODO Auto-generated method stub
super.onReceivedError(view,
errorCode, description, failingUrl);
}
});
5、WebChromeClient
处理各种对话框,加载进度,网站标题等。
wv.setWebChromeClient(new
WebChromeClient() {
@Override
public
void onCloseWindow(WebView window) {
//
TODO Auto-generated method stub
super.onCloseWindow(window);
}
@Override
public
boolean onCreateWindow(WebView view, boolean dialog,
boolean
userGesture, Message resultMsg) {
//
创建WebVIew时,走这里
return
super.onCreateWindow(view, dialog, userGesture,
resultMsg);
}
@Override
public
boolean onJsAlert(WebView view, String url, String message,
JsResult
result) {
//
定制自己的修改对话框
return
super.onJsAlert(view, url, message, result);
}
@Override
public
boolean onJsConfirm(WebView view, String url,
String
message, JsResult result) {
//
定制自己的确定对话框
return
super.onJsConfirm(view, url, message, result);
}
@Override
public
boolean onJsPrompt(WebView view, String url, String message,
String
defaultValue, JsPromptResult result) {
//
定制自己的提示对话框
return
super.onJsPrompt(view, url, message, defaultValue,
result);
}
@Override
public
void onProgressChanged(WebView view, int newProgress) {
//
这里可以知道页面加载了多少哦!
super.onProgressChanged(view,
newProgress);
}
});
===================
WebView与Js交互 ====================
一、Js调用Android
1)
添加调用接口 webview.addJavascriptInterface(new AndroidAPI(this), "Instance");
2)添加调用类
AndroidAPI,Js可以调用AndroidAPI中的任意方法
public
class AndroidAPI {
private
Context c;
public
AndroidAPI(Context c) {
this.c
= c;
}
public
void Android_Method1() {
Toast.makeText(c,
"AndroidMethod1", Toast.LENGTH_SHORT).show();
}
public
String Android_Method2() {
return
"Android_Method2";
}
}
二、Android调用Js
1)
无参调用 webview.loadUrl("javascript:Js_Method()");
2)带参调用
webview.loadUrl("javascript:Js_Method(" + " 'Hello' " + ")");
三、Js通过Android打开文件选择器,Android将文件发送到Js
1)
在WebChromeClient中添加openFileChooser实现(openFileChooser为隐藏方法,不可用重写的方式,3个代表不同版 本的打开方式)
mWebView.setWebChromeClient(new
WebChromeClient() {
@SuppressWarnings("unused")
public
void openFileChooser(ValueCallback<Uri> uploadFile) {
uploadFile(uploadFile);
}
@SuppressWarnings("unused")
public
void openFileChooser(ValueCallback<Uri> uploadFile,
String
acceptType) {
uploadFile(uploadFile);
}
@SuppressWarnings("unused")
public
void openFileChooser(ValueCallback<Uri> uploadFile,
String
acceptType, String capture) {
uploadFile(uploadFile);
}
});
/**
打开文件选择器 */
private void uploadFile(ValueCallback<Uri> uploadFile) {
mUploadMessage = uploadFile;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(Intent.createChooser(i, "File Chooser"),
FILE_CHOOSER_CODE);
}
2)在OnActivityResult中接收选择文件,并返回给Js
@Override
protected
void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,
resultCode, data);
if
(requestCode == FILE_CHOOSER_CODE) {
if
(mUploadMessage == null)
return;
if
(data != null && resultCode == RESULT_OK) {
Uri
result = data.getData();
if
(result != null) {
mUploadMessage.onReceiveValue(result);
mUploadMessage
= null;
}
}
}
}