WebView学习指南
来源:互联网 发布:华硕主板bios网络唤醒 编辑:程序博客网 时间:2024/04/28 04:26
对话框测试 上一页
2、MainWebView3.java的内容,请注意注释内容:
package android.basic.lesson29;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.WebView;import android.webkit.WebViewClient;import android.widget.Button;import android.widget.Toast;public class MainWebView3 extends Activity {/** Called when the activity is first created. */@Overridepublic 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() {@Overridepublic 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;}});// 设置支持Javascriptwv.getSettings().setJavaScriptEnabled(true);// 定义并绑定按钮单击监听器b1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 加载URL assets目录下的内容可以用 "file:///android_asset" 前缀wv.loadUrl("file:///android_asset/html/test1.html");}});// 定义并绑定按钮单击监听器b2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 加载URL assets目录下的内容可以用 "file:///android_asset" 前缀wv.loadUrl("file:///android_asset/html/test3.html");}});// 定义并绑定按钮单击监听器b3.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Toast.makeText(getApplicationContext(), "WebViewClient.shouldOverrideUrlLoading", Toast.LENGTH_SHORT).show();// 使用自己的WebView组件来响应Url加载事件,而不是使用默认浏览器器加载页面wv.loadUrl(url);// 记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止吧,事件就会不会冒泡传递了,我们称之为消耗掉return true;}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {Toast.makeText(getApplicationContext(), "WebViewClient.onPageStarted", Toast.LENGTH_SHORT).show();super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {Toast.makeText(getApplicationContext(), "WebViewClient.onPageFinished", Toast.LENGTH_SHORT).show();super.onPageFinished(view, url);}@Overridepublic void onLoadResource(WebView view, String url) {Toast.makeText(getApplicationContext(), "WebViewClient.onLoadResource", Toast.LENGTH_SHORT).show();super.onLoadResource(view, url);}};// 设置WebViewClient对象wv.setWebViewClient(wvc);// 创建WebViewChromeClientWebChromeClient wvcc = new WebChromeClient() {// 处理Alert事件@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.confirm();}});builder.setCancelable(false);builder.create();builder.show();return true;}@Overridepublic void onReceivedTitle(WebView view, String title) {MainWebView3.this.setTitle("可以用onReceivedTitle()方法修改网页标题");super.onReceivedTitle(view, title);}// 处理Confirm事件@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.confirm();}});builder.setNeutralButton(android.R.string.cancel, new AlertDialog.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.cancel();}});builder.setCancelable(false);builder.create();builder.show();return true;}// 处理提示事件@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue,JsPromptResult result) {// 看看默认的效果return super.onJsPrompt(view, url, message, defaultValue, result);}};// 设置setWebChromeClient对象wv.setWebChromeClient(wvcc);}}
3、运行程序,查看结果:
启动起来时的画面
点击第一个按钮,我们可以看到WebViewClient对象中定义的方法的确被调用了。
点击第二个按钮,我们看到加载的网页中有两个按钮,我们知道默认情况下Android会直接忽略掉由javascript弄出来的alert等弹出信息,除非我们在WebChromeClient中覆盖onJsAlert()方法和onJsConfirm()方法,让我们分别点击它们看看效果。
接下来我们再页面中跳转几次后,使用后退按钮,查看我们是否屏蔽了Activity默认的行为,结果当然是屏蔽了^_^,这一段代码没有留意的同学回去在看一下吧。
接下来我们把页面切换到这一个网页:
然后我们按下第三个保存图片的按钮,不出意外的话我们截取到了该页的完整图片,并把它保存到了sdcard中了,我在这里展示一下我截取的效果给你看,别被它清晰的效果吓住就行^_^
好了,因为篇幅关系,我们关于WebView的功能也只能介绍到这里,关于WebView的其它功能我们在接下来的项目中会涉及到,到时候我们再一起学习,本讲就到这里吧,各位下次再见。