WebView之WebViewClient、WebChromeClient
1.WebViewClient用来处理各种通知、请求等事件,WebView调用setWebViewClient()来指定一个WebViewClient对象。
WebViewClient常用方法
1. doUpdateVisitedHistory, 更新历史记录
2. onFormResubmission, 重新请求网页数据
3. onLoadResource, 加载资源
4. onPageFinished, 网页加载完毕
5. onPageStarted, 网页开始加载
6. onReceivedError, 报告错误信息
7. onScaleChanged, 发生Scale改变
8. shouldOverrideUrlLoading, 控制新的连接在当前WebView中打开
新建 MyWebViewClient继承WebViewClient,重写其中的方法,通过setWebViewClient指定
mWebView.setWebViewClient(new MyWebViewClient());
<span style="font-size:14px;"> private class MyWebViewClient extends WebViewClient{
@Override
public void doUpdateVisitedHistory(WebView view, String url,
boolean isReload) {
// TODO Auto-generated method stub
super.doUpdateVisitedHistory(view, url, isReload);
Log.d("MyWebViewClient", "doUpdateVisitedHistory, 更新历史记录 url = " + url);
}
@Override
public void onFormResubmission(WebView view, Message dontResend,
Message resend) {
// TODO Auto-generated method stub
super.onFormResubmission(view, dontResend, resend);
Log.d("MyWebViewClient", "onFormResubmission, 重新请求网页数据 dontResend = " + dontResend + "-- resend = " + resend);
}
@Override
public void onLoadResource(WebView view, String url) {
// TODO Auto-generated method stub
super.onLoadResource(view, url);
Log.d("MyWebViewClient", "onLoadResource, 加载资源 url = " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
Log.d("MyWebViewClient", "onPageFinished, 网页加载完毕 url = " + url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
Log.d("MyWebViewClient", "onPageStarted, 网页开始加载 url = " + url);
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// TODO Auto-generated method stub
super.onReceivedError(view, errorCode, description, failingUrl);
Log.d("MyWebViewClient", "onLoadResource, 报告错误信息 failingUrl = " + failingUrl);
}
@Override
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
// TODO Auto-generated method stub
super.onReceivedHttpAuthRequest(view, handler, host, realm);
Log.d("MyWebViewClient", "onReceivedHttpAuthRequest realm = " + realm);
}
@SuppressLint("NewApi") @Override
public void onReceivedLoginRequest(WebView view, String realm,
String account, String args) {
// TODO Auto-generated method stub
super.onReceivedLoginRequest(view, realm, account, args);
Log.d("MyWebViewClient", "onReceivedLoginRequest realm = " + realm);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
// TODO Auto-generated method stub
super.onReceivedSslError(view, handler, error);
Log.d("MyWebViewClient", "onReceivedSslError error = " + error);
}
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
// TODO Auto-generated method stub
super.onScaleChanged(view, oldScale, newScale);
Log.d("MyWebViewClient", "onScaleChanged, 发生Scale改变 oldScale = " + oldScale);
}
@Override
public void onTooManyRedirects(WebView view, Message cancelMsg,
Message continueMsg) {
// TODO Auto-generated method stub
super.onTooManyRedirects(view, cancelMsg, continueMsg);
Log.d("MyWebViewClient", "onTooManyRedirects continueMsg = " + continueMsg);
}
@Override
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
// TODO Auto-generated method stub
super.onUnhandledKeyEvent(view, event);
Log.d("MyWebViewClient", "onUnhandledKeyEvent event = " + event);
}
@SuppressLint("NewApi") @Override
public WebResourceResponse shouldInterceptRequest(WebView view,
String url) {
// TODO Auto-generated method stub
Log.d("MyWebViewClient", "shouldInterceptRequest url = " + url);
return super.shouldInterceptRequest(view, url);
}
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
// TODO Auto-generated method stub
Log.d("MyWebViewClient", "shouldOverrideKeyEvent event = " + event);
return super.shouldOverrideKeyEvent(view, event);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
Log.d("MyWebViewClient", "shouldOverrideUrlLoading url = " + url);
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
}</span>
2.WebChromeClient用来处理JavaScript对话框、网站图标、网站title、加载进度等
WebChromeClient常用方法
1. onCloseWindow,
2. onCreateWindow,
3. onJsAlert,
响应在Html页面JS调用alert("Good Morning!");,可以自己新建AlertDialog代替JS Alert,需要
return true;
如果
return super.onJsAlert(view, url, message, result);
则会继续调用系统Alert
4. onJsConfirm,
confirm("Are you ok?");其它同Alert
5. onJsPrompt,
prompt("What’s yourname?"); 其它同Alert
6. onProgressChanged,
页面加载进度
7. onReceivedIcon,
返回页面icon,在HTML页面设置如下
<link rel="shortcut icon" href="./images/icon1.png" >
8. onReceivedTitle,
返回页面icon,在HTML页面设置如下
<title>Android WebView Test</title>
9. onRequestFocus
具体操作如下:
新建MyWebChromeClient继承WebViewClient,重写其中的方法,通过setWebChromeClient指定
mWebView.setWebChromeClient(new MyWebChromeClient());
private class MyWebChromeClient extends WebChromeClient{
@Override
public void onCloseWindow(WebView window) {
// TODO Auto-generated method stub
super.onCloseWindow(window);
Log.d("MyWebChromeClient", "onCloseWindow");
}
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
// TODO Auto-generated method stub
Log.d("MyWebChromeClient", "onCreateWindow resultMsg = " + resultMsg);
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
@Override
public boolean onJsAlert(WebView view, String url, String message,
final JsResult result) {
// TODO Auto-generated method stub
Log.d("MyWebChromeClient", "onJsAlert url = " + url + " message = " + message);
//构建一个Builder来显示网页中的alert对话框
Builder builder = new Builder(MainActivity.this);
builder.setTitle("提示对话框");
builder.setMessage(message);
builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setCancelable(false);
builder.create();
builder.show();
return true;
// return super.onJsAlert(view, url, message, result);
}
@Override
public boolean onJsConfirm(WebView view, String url, String message,
final JsResult result) {
// TODO Auto-generated method stub
Log.d("MyWebChromeClient", "onJsConfirm url = " + url + " message = " + message);
Builder builder = new Builder(MainActivity.this);
builder.setTitle("带选择的对话框");
builder.setMessage(message);
builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setNeutralButton(android.R.string.cancel, new AlertDialog.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setCancelable(false);
builder.create();
builder.show();
return true;
// return super.onJsConfirm(view, url, message, result);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, final JsPromptResult result) {
// TODO Auto-generated method stub
Log.d("MyWebChromeClient", "onJsPrompt url = " + url + " message = " + message);
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
final View v = inflater.inflate(R.layout.prom_dialog, null);
//设置 TextView对应网页中的提示信息
((TextView)v.findViewById(R.id.TextView_PROM)).setText(message);
//设置EditText对应网页中的输入框
((EditText)v.findViewById(R.id.EditText_PROM)).setText(defaultValue);
Builder builder = new Builder(MainActivity.this);
builder.setTitle("带输入的对话框 ");
builder.setView(v);
builder.setPositiveButton(android.R.string.ok,new AlertDialog.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String value =((EditText)v.findViewById(R.id.EditText_PROM)).getText().toString();
result.confirm(value);
}
});
builder.setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setOnCancelListener(new DialogInterface.OnCancelListener(){
@Override
public void onCancel(DialogInterface dialog){
// TODO Auto-generated method stub
result.cancel();
}
});
builder.create();
builder.show();
return true;
// return super.onJsPrompt(view, url, message, defaultValue, result);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
Log.d("MyWebChromeClient", "onProgressChanged newProgress = " + newProgress);
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
// TODO Auto-generated method stub
super.onReceivedIcon(view, icon);
Log.d("MyWebChromeClient", "onReceivedIcon icon = " + icon);
ImageView imageView = (ImageView)findViewById(R.id.imageview);
imageView.setImageBitmap(icon);
}
@Override
public void onReceivedTitle(WebView view, String title) {
// TODO Auto-generated method stub
super.onReceivedTitle(view, title);
Log.d("MyWebChromeClient", "onReceivedTitle title = " + title);
}
@Override
public void onRequestFocus(WebView view) {
// TODO Auto-generated method stub
super.onRequestFocus(view);
Log.d("MyWebChromeClient", "onRequestFocus");
}
}