在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:

onLoadResource、onPageStart、onPageFinish、onReceiveError、onReceivedHttpAuthRequest;

 

WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等

 onCloseWindow(关闭WebView)、onCreateWindow()、onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)、onJsPrompt、onJsConfirm、onProgressChanged、onReceivedIcon、onReceivedTitle;


下面看看这三者之间的应用关系;

package EOE.android.demo1; 
import java.io.FileOutputStream; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.DialogInterface; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Picture; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.webkit.JsPromptResult; 
import android.webkit.JsResult; 
import android.webkit.WebChromeClient; 
import android.webkit.WebViewClient; 
import android.widget.Button; 
import android.widget.Toast; 


public class MainWebView3 extends Activity { 

/** Called when the activity is first created. */ 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

// 定义UI组件 
Button b1 = (Button) findViewById(R.id.Button01); 
Button b2 = (Button) findViewById(R.id.Button02); 
Button b3 = (Button) findViewById(R.id.Button03); 
final WebView wv = (WebView) findViewById(R.id.WebView01); 

// 覆盖默认后退按钮的作用,替换成WebView里的查看历史页面 
wv.setOnKeyListener(new View.OnKeyListener() { 
@Override 
public boolean onKey(View v, int keyCode, KeyEvent event) { 
if (event.getAction() == KeyEvent.ACTION_DOWN) { 
if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) { 
wv.goBack(); 
return true; 


return false; 



}); 


// 设置支持Javascript 


wv.getSettings().setJavaScriptEnabled(true); 


// 定义并绑定按钮单击监听器 


b1.setOnClickListener(new View.OnClickListener() { 


@Override 
public void onClick(View v) { 


// 加载URL assets目录下的内容可以用 "[url=file:///android_asset]file:///android_asset[/url]" 前缀 


wv.loadUrl("[url=file:///android_asset/html/test1.html]file:///android_asset/html/test1.html[/url]"); 





}); 


// 定义并绑定按钮单击监听器 


b2.setOnClickListener(new View.OnClickListener() { 


@Override 
public void onClick(View v) { 




// 加载URL assets目录下的内容可以用 "[url=file:///android_asset]file:///android_asset[/url]" 前缀 


wv.loadUrl("[url=file:///android_asset/html/test3.html]file:///android_asset/html/test3.html[/url]"); 





}); 


// 定义并绑定按钮单击监听器 


b3.setOnClickListener(new View.OnClickListener() { 


@Override 
public void onClick(View v) { 


Picture pic = wv.capturePicture(); 


int width = pic.getWidth(); 


int height = pic.getHeight(); 


if (width > 0 && height > 0) { 


Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 


Canvas canvas = new Canvas(bmp); 


pic.draw(canvas); 


try { 


String fileName = "sdcard/" + System.currentTimeMillis() + ".png"; 


FileOutputStream fos = new FileOutputStream(fileName); 


if (fos != null) { 


bmp.compress(Bitmap.CompressFormat.PNG, 90, fos); 


fos.close(); 





Toast.makeText(getApplicationContext(), "截图成功,文件名是:" + fileName, Toast.LENGTH_SHORT).show(); 


} catch (Exception e) { 


e.printStackTrace(); 











}); 


// 创建WebViewClient对象 


WebViewClient wvc = new WebViewClient() { 


@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 


Toast.makeText(getApplicationContext(), "WebViewClient.shouldOverrideUrlLoading", Toast.LENGTH_SHORT) .show(); 


// 使用自己的WebView组件来响应Url加载事件,而不是使用默认浏览器器加载页面 


wv.loadUrl(url); 


// 记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止吧,事件就会不会冒泡传递了,我们称之为消耗掉 


return true; 





@Override 
public void onPageStarted(WebView view, String url, Bitmap favicon) { 


Toast.makeText(getApplicationContext(), "WebViewClient.onPageStarted", Toast.LENGTH_SHORT).show(); 


super.onPageStarted(view, url, favicon); 





@Override 
public void onPageFinished(WebView view, String url) { 
Toast.makeText(getApplicationContext(), "WebViewClient.onPageFinished", Toast.LENGTH_SHORT).show(); 


super.onPageFinished(view, url); 





@Override 
public void onLoadResource(WebView view, String url) { 


Toast.makeText(getApplicationContext(), "WebViewClient.onLoadResource", Toast.LENGTH_SHORT).show(); 


super.onLoadResource(view, url); 





}; 


// 设置WebViewClient对象 


wv.setWebViewClient(wvc); 


// 创建WebViewChromeClient 


WebChromeClient wvcc = new WebChromeClient() { 


// 处理Alert事件 


@Override 
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { 


// 构建一个Builder来显示网页中的alert对话框 


Builder builder = new Builder(MainWebView3.this); 


builder.setTitle("计算1+2的值"); 


builder.setMessage(message); 


builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 


@Override 
public void onClick(DialogInterface dialog, int which) { 


result.confirm(); 





}); 


builder.setCancelable(false); 


builder.create(); 


builder.show(); 


return true; 







@Override 
public void onReceivedTitle(WebView view, String title) { 


MainWebView3.this.setTitle("可以用onReceivedTitle()方法修改网页标题"); 


super.onReceivedTitle(view, title); 





// 处理Confirm事件 


@Override 
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { 


Builder builder = new Builder(MainWebView3.this); 


builder.setTitle("删除确认"); 


builder.setMessage(message); 


builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 


@Override 
public void onClick(DialogInterface dialog, int which) { 


result.confirm(); 





}); 


builder.setNeutralButton(android.R.string.cancel, new AlertDialog.OnClickListener() { 


@Override 
public void onClick(DialogInterface dialog, int which) { 


result.cancel(); 





}); 


builder.setCancelable(false); 


builder.create(); 


builder.show(); 


return true; 





// 处理提示事件 


@Override 
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, 


JsPromptResult result) { 


// 看看默认的效果 


return super.onJsPrompt(view, url, message, defaultValue, result); 





}; 


// 设置setWebChromeClient对象 


wv.setWebChromeClient(wvcc); 






更多相关文章

  1. 为何GoogleSearch中可以嵌入EditText?
  2. WebView中捕获JavaScript事件
  3. Android(安卓)— 手撸代码学习事件分发的过程
  4. 解决Android(安卓)应用方法数不能超过65K的问题
  5. Bitmap.Options和LruCache——Android高效加载大图、多图解决方
  6. Picasso源码分析
  7. [置顶] android中屏幕触摸事件
  8. android_8.1 hdmi设备热插拔事件
  9. 使用android SharedPreference判断程序是否第一次运行

随机推荐

  1. android loggin
  2. 在Android中加入GOOGLE统计系统
  3. Delphi XE5的Android开发平台搭建
  4. android textview 中超出屏幕宽度的字符
  5. android命令行启动
  6. Android TabHost学习笔记
  7. android启动界面说明
  8. Android Data Binder 的一个bug
  9. Android(安卓)源码编译
  10. Android中使用listview实现qq/微信好友列