在智能移动设备上打开浏览器浏览网页是移动用户很经常的操作。本文就来讲解Android中一个可以进行网页显示的控件WebView。同Chrome和Safari一样,WebView的网页渲染引擎也是Webkit。

使用WebView控件进行Android互联网程序开发又如下优势:

1、可以打开远程网址、也可以加载本地Html数据。

2、可以搭建Java和Javascript交互桥梁。

3、WebView控件可以高度定制。

下面我们通过几个例子来共同学习WebView的使用方法。

一、先做一个例子热热身看看效果:通过WebView访问一个网站

1、先来一个简单的例子,新建一个项目Lesson29_WebView。

2、因为要访问互联网所以先在AndroidManifest.xml中设定权限:

XML/HTML代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"package="android.basic.lesson29"android:versioncode="1"android:versionname="1.0">
  3. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  4. <activityandroid:label="@string/app_name"android:name=".MainWebView">
  5. <intent-filter="">
  6. <actionandroid:name="android.intent.action.MAIN">
  7. <categoryandroid:name="android.intent.category.LAUNCHER">
  8. </category></action></intent>
  9. </activity>
  10. </application>
  11. <uses-sdk=""android:minsdkversion="8">
  12. <uses-permission=""android:name="android.permission.INTERNET">
  13. </uses></uses></manifest>

3、在res/layout/main.xml中放置一个输入框,一个按钮和一个WebView:

XML/HTML代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <linearlayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#fff">
  3. </linearlayout>
  4. <linearlayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content">
  5. <edittextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="http://android.yaohuiji.com"android:id="@+id/EditText01"android:layout_weight="1">
  6. </edittext>
  7. <buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Go"android:id="@+id/Button01"android:layout_weight="0">
  8. </button>
  9. </linearlayout>
  10. <webviewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#fff"android:id="@+id/WebView01">
  11. </webview>

4、在Activity文件的OnCreate方法中默认载入一个百度页面,点击按钮时载入预设的网址:

Java代码
  1. packageandroid.basic.lesson29;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.View;
  5. importandroid.webkit.WebView;
  6. importandroid.widget.Button;
  7. importandroid.widget.EditText;
  8. publicclassMainWebViewextendsActivity{
  9. WebViewmWebView;
  10. /**Calledwhentheactivityisfirstcreated.*/
  11. @Override
  12. publicvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. //定义UI组件
  16. mWebView=(WebView)findViewById(R.id.WebView01);
  17. Buttonb1=(Button)findViewById(R.id.Button01);
  18. finalEditTextet=(EditText)findViewById(R.id.EditText01);
  19. //得到WebSetting对象,设置支持Javascript的参数
  20. mWebView.getSettings().setJavaScriptEnabled(true);
  21. //载入URL
  22. mWebView.loadUrl("http://www.baidu.com");
  23. //使页面获得焦点
  24. mWebView.requestFocus();
  25. //给按钮绑定单击监听器
  26. b1.setOnClickListener(newView.OnClickListener(){
  27. @Override
  28. publicvoidonClick(Viewv){
  29. //访问编辑框中的网址
  30. mWebView.loadUrl(et.getText().toString());
  31. }
  32. });
  33. }
  34. }

运行程序,在编辑框中输入一个网址,点击Go按钮,就可以看到该网页显示,不过没有经过任何缩放处理,在接下里的例子我们继续研究,如何做更多的控制。

二、WebSettings基础知识补充

1、先看一下WebView的继承关系,可以看到它不是在android.widget包中,而是在android.webkit包中。

2、WebSettings :WebView组件有一个辅助类叫WebSettings,它管理WebView的设置状态。该对象可以通过WebView.getSettings()方法获得。下面举几个例子来说明WebSettings的用法:

Java代码
  1. //得到WebSettings对象,设置支持Javascript的参数
  2. mWebView.getSettings().setJavaScriptEnabled(true);
  3. //设置可以支持缩放
  4. mWebView.getSettings().setSupportZoom(true);
  5. //设置默认缩放方式尺寸是far
  6. mWebView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
  7. //设置出现缩放工具
  8. mWebView.getSettings().setBuiltInZoomControls(true);

三、加载assets目录下的本地网页

WebView调用assets目录下的本地网页和图片等资源非常方便,使用形如:

wv.loadUrl("file:///android_asset/html/test1.html");

的调用方法即可,代码在第四段落里。

在test1中点击链接也可以跳转到test2。

四、使用LoadData方法加载内容

可以在Java文件中或者XML文件中定义HTML的片段,也可以在assets目录中存放HTML文件,然后使用LoadData加载其中的内容,展示出来。下面我们使用第三部分的网页来演示一下如何使用LoadData方法,并且看看他们之间的区别。

1、新建项目Lesson29_WebView2

2、新建2个Html文件在assets/html下,内容略去,res/layout/main.xml的内容也略去了,相信对你来说已经不成问题。

3、MainWebView2.java 的内容如下:

Java代码
  1. packageandroid.basic.lesson29;
  2. importjava.io.IOException;
  3. importjava.io.InputStream;
  4. importorg.apache.http.util.ByteArrayBuffer;
  5. importorg.apache.http.util.EncodingUtils;
  6. importandroid.app.Activity;
  7. importandroid.os.Bundle;
  8. importandroid.view.View;
  9. importandroid.webkit.WebView;
  10. importandroid.widget.Button;
  11. publicclassMainWebView2extendsActivity{
  12. /**Calledwhentheactivityisfirstcreated.*/
  13. @Override
  14. publicvoidonCreate(BundlesavedInstanceState){
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. //定义UI组件
  18. Buttonb1=(Button)findViewById(R.id.Button01);
  19. Buttonb2=(Button)findViewById(R.id.Button02);
  20. finalWebViewwv=(WebView)findViewById(R.id.WebView01);
  21. //定义并绑定按钮单击监听器
  22. b1.setOnClickListener(newView.OnClickListener(){
  23. @Override
  24. publicvoidonClick(Viewv){
  25. //加载URLassets目录下的内容可以用"file:///android_asset"前缀
  26. wv.loadUrl("file:///android_asset/html/test1.html");
  27. }
  28. });
  29. //定义并绑定按钮单击监听器
  30. b2.setOnClickListener(newView.OnClickListener(){
  31. @Override
  32. publicvoidonClick(Viewv){
  33. Stringdata="";
  34. try{
  35. //读取assets目录下的文件需要用到AssetManager对象的Open方法打开文件
  36. InputStreamis=getAssets().open("html/test2.html");
  37. //loadData()方法需要的是一个字符串数据所以我们需要把文件转成字符串
  38. ByteArrayBufferbaf=newByteArrayBuffer(500);
  39. intcount=0;
  40. while((count=is.read())!=-1){
  41. baf.append(count);
  42. }
  43. data=EncodingUtils.getString(baf.toByteArray(),"utf-8");
  44. }catch(IOExceptione){
  45. e.printStackTrace();
  46. }
  47. //下面两种方法都可以加载成功
  48. wv.loadData(data,"text/html","utf-8");
  49. //wv.loadDataWithBaseURL("",data,"text/html","utf-8","");
  50. }
  51. });
  52. }
  53. }

4、运行程序单击第二个按钮,效果如下:

对比上面的例子,我们可以看到两个明显的区别,其一,图片没加载出来,其二链接失效,点击后无法加载test1.html 。

五、两个和WebView相关的重要对象:WebChromeClient和WebViewClient

和WebView相关的辅助对象,除了WebSettings以外还有WebChromeClient和WebViewClient。

接下来的这个例子内容比较丰富,虽然注释比较清晰,但是您一次消化起来还是比较困难的,因此您需要的是一点点耐心,多看几遍,最重要的是自己至少敲代码敲一遍。

1、在上面的例子中继续增加内容,增加test3.html的内容:

XML/HTML代码
  1. <scripttype="text/JavaScript">
  2. functionalertFuction(){
  3. vara=1;
  4. varb=2
  5. alert(a+b);
  6. }
  7. functionconfirmFuction(){
  8. confirm("你确定要删除吗?")
  9. }
  10. </script>
  11. 对话框测试
  12. <inputonclick="alertFuction()"value="提醒对话框"type="button">
  13. <inputonclick="confirmFuction()"value="选择对话框"type="button">
  14. <ahref="test1.html">上一页</a>

2、MainWebView3.java的内容,请注意注释内容:

Java代码
  1. packageandroid.basic.lesson29;
  2. importjava.io.FileOutputStream;
  3. importandroid.app.Activity;
  4. importandroid.app.AlertDialog;
  5. importandroid.app.AlertDialog.Builder;
  6. importandroid.content.DialogInterface;
  7. importandroid.graphics.Bitmap;
  8. importandroid.graphics.Canvas;
  9. importandroid.graphics.Picture;
  10. importandroid.os.Bundle;
  11. importandroid.view.KeyEvent;
  12. importandroid.view.View;
  13. importandroid.webkit.JsPromptResult;
  14. importandroid.webkit.JsResult;
  15. importandroid.webkit.WebChromeClient;
  16. importandroid.webkit.WebView;
  17. importandroid.webkit.WebViewClient;
  18. importandroid.widget.Button;
  19. importandroid.widget.Toast;
  20. publicclassMainWebView3extendsActivity{
  21. /**Calledwhentheactivityisfirstcreated.*/
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26. //定义UI组件
  27. Buttonb1=(Button)findViewById(R.id.Button01);
  28. Buttonb2=(Button)findViewById(R.id.Button02);
  29. Buttonb3=(Button)findViewById(R.id.Button03);
  30. finalWebViewwv=(WebView)findViewById(R.id.WebView01);
  31. //覆盖默认后退按钮的作用,替换成WebView里的查看历史页面
  32. wv.setOnKeyListener(newView.OnKeyListener(){
  33. @Override
  34. publicbooleanonKey(Viewv,intkeyCode,KeyEventevent){
  35. if(event.getAction()==KeyEvent.ACTION_DOWN){
  36. if((keyCode==KeyEvent.KEYCODE_BACK)&&wv.canGoBack()){
  37. wv.goBack();
  38. returntrue;
  39. }
  40. }
  41. returnfalse;
  42. }
  43. });
  44. //设置支持Javascript
  45. wv.getSettings().setJavaScriptEnabled(true);
  46. //定义并绑定按钮单击监听器
  47. b1.setOnClickListener(newView.OnClickListener(){
  48. @Override
  49. publicvoidonClick(Viewv){
  50. //加载URLassets目录下的内容可以用"file:///android_asset"前缀
  51. wv.loadUrl("file:///android_asset/html/test1.html");
  52. }
  53. });
  54. //定义并绑定按钮单击监听器
  55. b2.setOnClickListener(newView.OnClickListener(){
  56. @Override
  57. publicvoidonClick(Viewv){
  58. //加载URLassets目录下的内容可以用"file:///android_asset"前缀
  59. wv.loadUrl("file:///android_asset/html/test3.html");
  60. }
  61. });
  62. //定义并绑定按钮单击监听器
  63. b3.setOnClickListener(newView.OnClickListener(){
  64. @Override
  65. publicvoidonClick(Viewv){
  66. Picturepic=wv.capturePicture();
  67. intwidth=pic.getWidth();
  68. intheight=pic.getHeight();
  69. if(width>0&&height>0){
  70. Bitmapbmp=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
  71. Canvascanvas=newCanvas(bmp);
  72. pic.draw(canvas);
  73. try{
  74. StringfileName="sdcard/"+System.currentTimeMillis()+".png";
  75. FileOutputStreamfos=newFileOutputStream(fileName);
  76. if(fos!=null){
  77. bmp.compress(Bitmap.CompressFormat.PNG,90,fos);
  78. fos.close();
  79. }
  80. Toast.makeText(getApplicationContext(),"截图成功,文件名是:"+fileName,Toast.LENGTH_SHORT).show();
  81. }catch(Exceptione){
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. });
  87. //创建WebViewClient对象
  88. WebViewClientwvc=newWebViewClient(){
  89. @Override
  90. publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
  91. Toast.makeText(getApplicationContext(),"WebViewClient.shouldOverrideUrlLoading",Toast.LENGTH_SHORT)
  92. .show();
  93. //使用自己的WebView组件来响应Url加载事件,而不是使用默认浏览器器加载页面
  94. wv.loadUrl(url);
  95. //记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止吧,事件就会不会冒泡传递了,我们称之为消耗掉
  96. returntrue;
  97. }
  98. @Override
  99. publicvoidonPageStarted(WebViewview,Stringurl,Bitmapfavicon){
  100. Toast.makeText(getApplicationContext(),"WebViewClient.onPageStarted",Toast.LENGTH_SHORT).show();
  101. super.onPageStarted(view,url,favicon);
  102. }
  103. @Override
  104. publicvoidonPageFinished(WebViewview,Stringurl){
  105. Toast.makeText(getApplicationContext(),"WebViewClient.onPageFinished",Toast.LENGTH_SHORT).show();
  106. super.onPageFinished(view,url);
  107. }
  108. @Override
  109. publicvoidonLoadResource(WebViewview,Stringurl){
  110. Toast.makeText(getApplicationContext(),"WebViewClient.onLoadResource",Toast.LENGTH_SHORT).show();
  111. super.onLoadResource(view,url);
  112. }
  113. };
  114. //设置WebViewClient对象
  115. wv.setWebViewClient(wvc);
  116. //创建WebViewChromeClient
  117. WebChromeClientwvcc=newWebChromeClient(){
  118. //处理Alert事件
  119. @Override
  120. publicbooleanonJsAlert(WebViewview,Stringurl,Stringmessage,finalJsResultresult){
  121. //构建一个Builder来显示网页中的alert对话框
  122. Builderbuilder=newBuilder(MainWebView3.this);
  123. builder.setTitle("计算1+2的值");
  124. builder.setMessage(message);
  125. builder.setPositiveButton(android.R.string.ok,newAlertDialog.OnClickListener(){
  126. @Override
  127. publicvoidonClick(DialogInterfacedialog,intwhich){
  128. result.confirm();
  129. }
  130. });
  131. builder.setCancelable(false);
  132. builder.create();
  133. builder.show();
  134. returntrue;
  135. }
  136. @Override
  137. publicvoidonReceivedTitle(WebViewview,Stringtitle){
  138. MainWebView3.this.setTitle("可以用onReceivedTitle()方法修改网页标题");
  139. super.onReceivedTitle(view,title);
  140. }
  141. //处理Confirm事件
  142. @Override
  143. publicbooleanonJsConfirm(WebViewview,Stringurl,Stringmessage,finalJsResultresult){
  144. Builderbuilder=newBuilder(MainWebView3.this);
  145. builder.setTitle("删除确认");
  146. builder.setMessage(message);
  147. builder.setPositiveButton(android.R.string.ok,newAlertDialog.OnClickListener(){
  148. @Override
  149. publicvoidonClick(DialogInterfacedialog,intwhich){
  150. result.confirm();
  151. }
  152. });
  153. builder.setNeutralButton(android.R.string.cancel,newAlertDialog.OnClickListener(){
  154. @Override
  155. publicvoidonClick(DialogInterfacedialog,intwhich){
  156. result.cancel();
  157. }
  158. });
  159. builder.setCancelable(false);
  160. builder.create();
  161. builder.show();
  162. returntrue;
  163. }
  164. //处理提示事件
  165. @Override
  166. publicbooleanonJsPrompt(WebViewview,Stringurl,Stringmessage,StringdefaultValue,
  167. JsPromptResultresult){
  168. //看看默认的效果
  169. returnsuper.onJsPrompt(view,url,message,defaultValue,result);
  170. }
  171. };
  172. //设置setWebChromeClient对象
  173. wv.setWebChromeClient(wvcc);
  174. }
  175. }

3、运行程序,查看结果:

启动起来时的画面:

点击第一个按钮,我们可以看到WebViewClient对象中定义的方法的确被调用了。

点击第二个按钮,我们看到加载的网页中有两个按钮,我们知道默认情况下Android会直接忽略掉由javascript弄出来的alert等弹出信息,除非我们在WebChromeClient中覆盖onJsAlert()方法和onJsConfirm()方法,让我们分别点击它们看看效果。

接下来我们再页面中跳转几次后,使用后退按钮,查看我们是否屏蔽了Activity默认的行为,结果当然是屏蔽了^_^,这一段代码没有留意的同学回去在看一下吧。

接下来我们把页面切换到这一个网页:

然后我们按下第三个保存图片的按钮,不出意外的话我们截取到了该页的完整图片,并把它保存到了sdcard中了。

好了,因为篇幅关系,我们关于WebView的功能也只能介绍到这里,关于WebView的其它功能我们在接下来的项目中会涉及到,到时候我们再一起学习,本讲就到这里吧,各位下次再见。

更多相关文章

  1. Android显示GIF动画 GifView
  2. android基本 UI(三)—单选RadioButton与复选按钮CheckBox
  3. android no target available 解决
  4. Android自定义Button按钮显示样式
  5. Android(安卓)LinearLayout中元素按比例分配宽度
  6. FFMPEG移植到Android(ubuntu环境下)
  7. Android(安卓)ListView item中有按钮(Button)不能点击或者条目不
  8. Android(安卓)Studio 中自带Android(安卓)Monitor监控内存溢出浅
  9. android 截图

随机推荐

  1. Android官方技术文档翻译——Eclilpse项
  2. android 开发 实现自动安装
  3. Android通过SystemProperties类查看系统
  4. Android JavaBinder: !!! FAILED BINDER
  5. Delphi XE5 for Android (三)
  6. android webview秒开框架
  7. ubuntu上实现Android(安卓)JNI示例
  8. 如何通过adb 设置cpu 不降频,性能优化分析
  9. Android之RemoteViews
  10. Gradle 打不同的安装包