WebView是Android中一个非常实用的组件,它和Safai、Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面。使用WebView开发软件有一下几个优点:

1.可以打开远程URL页面,也可以加载本地HTML数据;

2.可以无缝的在java和javascript之间进行交互操作;

3.高度的定制性,可根据开发者的需要进行多样性定制。

下面就通过例子来介绍一下WebView的使用方法。

我们先建一个webview项目,项目结构如左图:

在这个项目中,我们会先进入MainActivity这个导航界面(上边右图),通过点击不同按钮转向不同的Activity,下面分别简单介绍一下这几个Activity的所要演示的功能:

LoadActivity:主要演示加载网络页面和WebView的一些基本设置;

CaptureActivity:主要演示WebView的截图的功能;

FileActivity:主要演示访问本地文件的功能;

JSActivity:主要演示WebView对JS的支持以及JS和Java之间的互相调用;

接下来,我们会逐一分析各个Activity的相关信息:

LoadActivity:

与之对应的布局文件为load.xml,演示效果如下:

我们在文本框中输入URL,然后点击“load”按钮,然后由WebView加载相应的页面,在加载过程中,根据加载进度更新窗口的进度条。由于布局相对简单,我们主要来看一下LoadActivity.java的代码:

[java] view plaincopyprint?
  1. package com.scott.webview;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.KeyEvent;
  5. import android.view.View;
  6. import android.view.Window;
  7. import android.webkit.WebChromeClient;
  8. import android.webkit.WebSettings;
  9. import android.webkit.WebView;
  10. import android.webkit.WebViewClient;
  11. import android.widget.Button;
  12. import android.widget.EditText;
  13. public class LoadActivity extends Activity {
  14. private WebView webView;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. //设置窗口风格为进度条
  19. getWindow().requestFeature(Window.FEATURE_PROGRESS);
  20. setContentView(R.layout.load);
  21. webView = (WebView) findViewById(R.id.webView);
  22. WebSettings settings = webView.getSettings();
  23. settings.setSupportZoom(true);          //支持缩放
  24. settings.setBuiltInZoomControls(true);  //启用内置缩放装置
  25. settings.setJavaScriptEnabled(true);    //启用JS脚本
  26. webView.setWebViewClient(new WebViewClient() {
  27. //当点击链接时,希望覆盖而不是打开新窗口
  28. @Override
  29. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  30. view.loadUrl(url);  //加载新的url
  31. return true;    //返回true,代表事件已处理,事件流到此终止
  32. }
  33. });
  34. //点击后退按钮,让WebView后退一页(也可以覆写Activity的onKeyDown方法)
  35. webView.setOnKeyListener(new View.OnKeyListener() {
  36. @Override
  37. public boolean onKey(View v, int keyCode, KeyEvent event) {
  38. if (event.getAction() == KeyEvent.ACTION_DOWN) {
  39. if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
  40. webView.goBack();   //后退
  41. return true;    //已处理
  42. }
  43. }
  44. return false;
  45. }
  46. });
  47. webView.setWebChromeClient(new WebChromeClient() {
  48. //当WebView进度改变时更新窗口进度
  49. @Override
  50. public void onProgressChanged(WebView view, int newProgress) {
  51. //Activity的进度范围在0到10000之间,所以这里要乘以100
  52. LoadActivity.this.setProgress(newProgress * 100);
  53. }
  54. });
  55. final EditText url = (EditText) findViewById(R.id.url);
  56. Button loadURL = (Button) findViewById(R.id.loadURL);
  57. loadURL.setOnClickListener(new View.OnClickListener() {
  58. @Override
  59. public void onClick(View v) {
  60. webView.loadUrl(url.getText().toString());  //加载url
  61. webView.requestFocus(); //获取焦点
  62. }
  63. });
  64. }
  65. }

package com.scott.webview; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.Window; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.EditText; public class LoadActivity extends Activity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置窗口风格为进度条 getWindow().requestFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.load); webView = (WebView) findViewById(R.id.webView); WebSettings settings = webView.getSettings(); settings.setSupportZoom(true); //支持缩放 settings.setBuiltInZoomControls(true); //启用内置缩放装置 settings.setJavaScriptEnabled(true); //启用JS脚本 webView.setWebViewClient(new WebViewClient() { //当点击链接时,希望覆盖而不是打开新窗口 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); //加载新的url return true; //返回true,代表事件已处理,事件流到此终止 } }); //点击后退按钮,让WebView后退一页(也可以覆写Activity的onKeyDown方法) webView.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 && webView.canGoBack()) { webView.goBack(); //后退 return true; //已处理 } } return false; } }); webView.setWebChromeClient(new WebChromeClient() { //当WebView进度改变时更新窗口进度 @Override public void onProgressChanged(WebView view, int newProgress) { //Activity的进度范围在0到10000之间,所以这里要乘以100 LoadActivity.this.setProgress(newProgress * 100); } }); final EditText url = (EditText) findViewById(R.id.url); Button loadURL = (Button) findViewById(R.id.loadURL); loadURL.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { webView.loadUrl(url.getText().toString()); //加载url webView.requestFocus(); //获取焦点 } }); } }

可以看到,我们使用loadUrl方法加载一个url页面,然后重写WebChromeClient的onProgressChanged方法更新进度条。loadUrl方法除了能加载远程页面,还能加载本地的文件:

[java] view plaincopyprint?
  1. //加载assets中的html文件
  2. webView.loadUrl("file:///android_asset/index.html");
  3. //加载sdcard中的html文件
  4. webView.loadUrl("file:///mnt/sdcard/index.html");

//加载assets中的html文件 webView.loadUrl("file:///android_asset/index.html"); //加载sdcard中的html文件 webView.loadUrl("file:///mnt/sdcard/index.html");

这些都会在后边的示例中使用到。

CaptureActivity:

与之对应的布局文件为capture.xml,也比较简单,它的演示效果如下:

记得在AndroidManifest.xml中加入对sdcard的写权限:

[xhtml] view plaincopyprint?
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

截图成功后,在/mnt/sdcard目录下会生成一个当前网页的截图,如图:

我们导出一下,看看是不是当前的网页界面:

整个过程操作已经完成了,让我们来看一下CaptureActivity.java的代码:

[java] view plaincopyprint?
  1. package com.scott.webview;
  2. import java.io.FileOutputStream;
  3. import android.app.Activity;
  4. import android.graphics.Bitmap;
  5. import android.graphics.Canvas;
  6. import android.graphics.Picture;
  7. import android.os.Bundle;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.webkit.WebView;
  11. import android.widget.Button;
  12. import android.widget.Toast;
  13. public class CaptureActivity extends Activity {
  14. private static final String TAG = "CAPTURE";
  15. private WebView webView;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.capture);
  20. webView = (WebView) findViewById(R.id.webView);
  21. webView.loadUrl("http://www.baidu.com");
  22. Button capture = (Button) findViewById(R.id.capture);
  23. capture.setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. //取得android.graphics.Picture实例
  27. Picture picture = webView.capturePicture();
  28. int width = picture.getWidth();
  29. int height = picture.getHeight();
  30. if (width > 0 && height > 0) {
  31. //创建指定高宽的Bitmap对象
  32. Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  33. //创建Canvas,并以bitmap为绘制目标
  34. Canvas canvas = new Canvas(bitmap);
  35. //将WebView影像绘制在Canvas上
  36. picture.draw(canvas);
  37. try {
  38. String fileName = "/sdcard/webview_capture.jpg";
  39. FileOutputStream fos = new FileOutputStream(fileName);
  40. //压缩bitmap到输出流中
  41. bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
  42. fos.close();
  43. Toast.makeText(CaptureActivity.this, "CAPTURE SUCCESS", Toast.LENGTH_LONG).show();
  44. } catch (Exception e) {
  45. Log.e(TAG, e.getMessage());
  46. }
  47. }
  48. }
  49. });
  50. }
  51. }

package com.scott.webview; import java.io.FileOutputStream; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Picture; import android.os.Bundle; import android.util.Log; import android.view.View; import android.webkit.WebView; import android.widget.Button; import android.widget.Toast; public class CaptureActivity extends Activity { private static final String TAG = "CAPTURE"; private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.capture); webView = (WebView) findViewById(R.id.webView); webView.loadUrl("http://www.baidu.com"); Button capture = (Button) findViewById(R.id.capture); capture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //取得android.graphics.Picture实例 Picture picture = webView.capturePicture(); int width = picture.getWidth(); int height = picture.getHeight(); if (width > 0 && height > 0) { //创建指定高宽的Bitmap对象 Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); //创建Canvas,并以bitmap为绘制目标 Canvas canvas = new Canvas(bitmap); //将WebView影像绘制在Canvas上 picture.draw(canvas); try { String fileName = "/sdcard/webview_capture.jpg"; FileOutputStream fos = new FileOutputStream(fileName); //压缩bitmap到输出流中 bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.close(); Toast.makeText(CaptureActivity.this, "CAPTURE SUCCESS", Toast.LENGTH_LONG).show(); } catch (Exception e) { Log.e(TAG, e.getMessage()); } } } }); } }

FileActivity:

这个界面没有布局文件,在代码中完成,它将演示如何加载一段html代码,并应用刚才生成的网页截图,效果如下图:

在这个过程中,我们加载了截图,并给图加上了红色的边框,CaptureActivity.java代码如下:

[java] view plaincopyprint?
  1. package com.scott.webview;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.webkit.WebView;
  5. public class FileActivity extends Activity {
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. WebView webView = new WebView(this);
  10. webView.getSettings().setAllowFileAccess(true); //默认就是启用的,这里只是强调一下
  11. String baseURL = "file:///mnt/sdcard/";         //根URL
  12. String html = "<html><body>"
  13. + "<h3>image from sdcard:<h3><br/>"
  14. + "<img src='webview_capture.jpg' style='border:2px solid #FF0000;'/>"
  15. + "</body></html>";
  16. //加载相对于根URL下的数据,historyUrl设为null即可
  17. webView.loadDataWithBaseURL(baseURL, html, "text/html", "utf-8", null);
  18. setContentView(webView);
  19. }
  20. }

package com.scott.webview; import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; public class FileActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WebView webView = new WebView(this); webView.getSettings().setAllowFileAccess(true); //默认就是启用的,这里只是强调一下 String baseURL = "file:///mnt/sdcard/"; //根URL String html = "<html><body>" + "<h3>image from sdcard:<h3><br/>" + "<img src='webview_capture.jpg' style='border:2px solid #FF0000;'/>" + "</body></html>"; //加载相对于根URL下的数据,historyUrl设为null即可 webView.loadDataWithBaseURL(baseURL, html, "text/html", "utf-8", null); setContentView(webView); } }

如果将html文本保存成.html文件,放于/mnt/sdcard目录下,然后用以下方式加载也能达到相同的效果:

[java] view plaincopyprint?
  1. webView.loadUrl("file:///mnt/sdcard/index.html");

webView.loadUrl("file:///mnt/sdcard/index.html");

接下来是最后一个示例:JSActivity,也是最精彩的示例,演示如何在JS和Java之间通信,我们来看一下演示过程,如图:

然后谈谈我们的执行过程,我们需要在Java代码中设置WebView的一些事件的响应,比如alert、confirm以及prompt这些JS事件,让它们按照我们的要求呈现给用户,然后我们需要定义一个Java和JS之间的接口对象,当我们加载完一个html文档后,根据这个对象的接口名称就可以在文档的JS代码中轻松的调用这个接口对象的方法,执行Java代码,我们也可以在Java端执行html文档中的JS代码。下面我们将通过代码来证实这一过程:

JSActivity.java代码如下:

[java] view plaincopyprint?
  1. package com.scott.webview;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.app.AlertDialog;
  6. import android.content.DialogInterface;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.Message;
  10. import android.util.Log;
  11. import android.view.LayoutInflater;
  12. import android.view.View;
  13. import android.view.Window;
  14. import android.webkit.JsPromptResult;
  15. import android.webkit.JsResult;
  16. import android.webkit.WebChromeClient;
  17. import android.webkit.WebView;
  18. import android.widget.EditText;
  19. import android.widget.Toast;
  20. public class JSActivity extends Activity {
  21. private static final String TAG = "JSActivity";
  22. private  WebView webView;
  23. private Handler handler = new Handler() {
  24. public void handleMessage(android.os.Message msg) {
  25. int index = msg.arg1;
  26. JSActivity.this.setProgress(index * 1000);
  27. };
  28. };
  29. @Override
  30. public void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. getWindow().requestFeature(Window.FEATURE_PROGRESS);
  33. webView = new WebView(this);
  34. webView.getSettings().setJavaScriptEnabled(true);
  35. webView.addJavascriptInterface(new Object() {
  36. @SuppressWarnings("unused")
  37. public List<String> getList() {
  38. List<String> list = new ArrayList<String>();
  39. for (int i = 0; i <= 10; i++) {
  40. try {
  41. Thread.sleep(200);
  42. } catch (InterruptedException e) {
  43. Log.e(TAG, "error:" + e.getMessage());
  44. }
  45. list.add("current index is: " + i);
  46. //不能在此直接调用Activity.setProgress,否则会报以下错误
  47. //Only the original thread that created a view hierarchy can touch its views.
  48. Message msg = handler.obtainMessage();
  49. msg.arg1 = i;
  50. handler.sendMessage(msg);
  51. }
  52. success();
  53. return list;
  54. }
  55. public void success() {
  56. //由Java代码调用JS函数
  57. webView.loadUrl("javascript:success('congratulations')");
  58. }
  59. }, "bridge");
  60. webView.setWebChromeClient(new WebChromeClient() {
  61. @Override
  62. public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
  63. new AlertDialog.Builder(JSActivity.this)
  64. .setTitle("alert")
  65. .setMessage(message)
  66. .setPositiveButton("YES", new DialogInterface.OnClickListener() {
  67. @Override
  68. public void onClick(DialogInterface dialog, int which) {
  69. //处理结果为确定状态 同时唤醒WebCore线程
  70. result.confirm();
  71. }
  72. }).create().show();
  73. return true;    //已处理
  74. }
  75. @Override
  76. public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
  77. new AlertDialog.Builder(JSActivity.this)
  78. .setTitle("confirm")
  79. .setMessage(message)
  80. .setPositiveButton("YES", new DialogInterface.OnClickListener() {
  81. @Override
  82. public void onClick(DialogInterface dialog, int which) {
  83. Toast.makeText(JSActivity.this, "you clicked yes", 0).show();
  84. result.confirm();
  85. }
  86. })
  87. .setNegativeButton("NO", new DialogInterface.OnClickListener() {
  88. @Override
  89. public void onClick(DialogInterface dialog, int which) {
  90. //处理结果为取消状态 同时唤醒WebCore线程
  91. result.cancel();
  92. }
  93. }).create().show();
  94. return true;
  95. }
  96. @Override
  97. public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
  98. final JsPromptResult result) {
  99. LayoutInflater inflater = getLayoutInflater();
  100. View prompt = inflater.inflate(R.layout.prompt, null);
  101. final EditText text = (EditText) prompt.findViewById(R.id.prompt_input);
  102. text.setHint(defaultValue);
  103. new AlertDialog.Builder(JSActivity.this)
  104. .setTitle("prompt")
  105. .setView(prompt)
  106. .setPositiveButton("YES", new DialogInterface.OnClickListener() {
  107. @Override
  108. public void onClick(DialogInterface dialog, int which) {
  109. //记录结果
  110. result.confirm(text.getText().toString());
  111. }
  112. })
  113. .setNegativeButton("NO", new DialogInterface.OnClickListener() {
  114. @Override
  115. public void onClick(DialogInterface dialog, int which) {
  116. result.cancel();
  117. }
  118. }).create().show();
  119. return true;
  120. }
  121. });
  122. //加载assets中的html文件
  123. webView.loadUrl("file:///android_asset/index.html");
  124. setContentView(webView);
  125. }
  126. }

package com.scott.webview; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.webkit.JsPromptResult; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.widget.EditText; import android.widget.Toast; public class JSActivity extends Activity { private static final String TAG = "JSActivity"; private WebView webView; private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { int index = msg.arg1; JSActivity.this.setProgress(index * 1000); }; }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_PROGRESS); webView = new WebView(this); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new Object() { @SuppressWarnings("unused") public List<String> getList() { List<String> list = new ArrayList<String>(); for (int i = 0; i <= 10; i++) { try { Thread.sleep(200); } catch (InterruptedException e) { Log.e(TAG, "error:" + e.getMessage()); } list.add("current index is: " + i); //不能在此直接调用Activity.setProgress,否则会报以下错误 //Only the original thread that created a view hierarchy can touch its views. Message msg = handler.obtainMessage(); msg.arg1 = i; handler.sendMessage(msg); } success(); return list; } public void success() { //由Java代码调用JS函数 webView.loadUrl("javascript:success('congratulations')"); } }, "bridge"); webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(JSActivity.this) .setTitle("alert") .setMessage(message) .setPositiveButton("YES", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //处理结果为确定状态 同时唤醒WebCore线程 result.confirm(); } }).create().show(); return true; //已处理 } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(JSActivity.this) .setTitle("confirm") .setMessage(message) .setPositiveButton("YES", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(JSActivity.this, "you clicked yes", 0).show(); result.confirm(); } }) .setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //处理结果为取消状态 同时唤醒WebCore线程 result.cancel(); } }).create().show(); return true; } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { LayoutInflater inflater = getLayoutInflater(); View prompt = inflater.inflate(R.layout.prompt, null); final EditText text = (EditText) prompt.findViewById(R.id.prompt_input); text.setHint(defaultValue); new AlertDialog.Builder(JSActivity.this) .setTitle("prompt") .setView(prompt) .setPositiveButton("YES", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //记录结果 result.confirm(text.getText().toString()); } }) .setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }).create().show(); return true; } }); //加载assets中的html文件 webView.loadUrl("file:///android_asset/index.html"); setContentView(webView); } }

需要注意的是,在重写onJsAlert、onJsConfirm、onJsPrompt这几个方法中,不要忘了用JsResult.confirm()或JsResult.cancel()处理结果,否则页面就不能再响应接下的事件了,关于这一点,我们可以看一下JsResult的代码:

[c-sharp] view plaincopyprint?
  1. /**
  2. * Handle a confirmation response from the user.
  3. */
  4. public final void confirm() {
  5. mResult = true;
  6. wakeUp();
  7. }
  8. /**
  9. * Handle the result if the user cancelled the dialog.
  10. */
  11. public final void cancel() {
  12. mResult = false;
  13. wakeUp();
  14. }

/** * Handle a confirmation response from the user. */ public final void confirm() { mResult = true; wakeUp(); } /** * Handle the result if the user cancelled the dialog. */ public final void cancel() { mResult = false; wakeUp(); }

可以看到confirm和cancel方法都涉及到了一个wakeUp方法,这个方法主要作用是唤醒WebCore线程,定义如下:

[c-sharp] view plaincopyprint?
  1. /* Wake up the WebCore thread. */
  2. protected final void wakeUp() {
  3. if (mReady) {
  4. synchronized (mProxy) {
  5. mProxy.notify();
  6. }
  7. } else {
  8. mTriedToNotifyBeforeReady = true;
  9. }
  10. }

/* Wake up the WebCore thread. */ protected final void wakeUp() { if (mReady) { synchronized (mProxy) { mProxy.notify(); } } else { mTriedToNotifyBeforeReady = true; } }

所以朋友们如果要重写这几个方法时要切记处理JsResult这个对象实例。

我们在处理onJsPrompt时,使用了自定义的界面,加载的是/res/layout/prompt.xml,定义如下:

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content">
  6. <EditText
  7. android:id="@+id/prompt_input"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"/>
  10. </LinearLayout>

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <EditText android:id="@+id/prompt_input" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout>

在JSActivity.java代码中,我们注意到WebView组件加载了assets中的index.html,它包含与Java交互的JS代码,如下:

[xhtml] view plaincopyprint?
  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. function doAlert() {
  5. alert("hello!");
  6. }
  7. function doConfirm() {
  8. confirm("are you sure?");
  9. }
  10. function doPrompt() {
  11. var val = prompt("what's your name?");
  12. if (val) {
  13. alert("your name is:" + val);
  14. }
  15. }
  16. function getList() {
  17. //使用java和javascript的接口bridge的方法获取集合
  18. var list = window.bridge.getList();
  19. var result = document.getElementById("result");
  20. for (var i = 0; i < list.size(); i++) {
  21. var div = document.createElement("div");
  22. div.innerHTML = list.get(i).toString();
  23. result.appendChild(div);
  24. }
  25. }
  26. function success(msg) {
  27. alert(msg);
  28. }
  29. </script>
  30. </head>
  31. <body background="black">
  32. <input type="button" value="alert" onclick="doAlert()"/><br/>
  33. <input type="button" value="confirm" onclick="doConfirm()"/><br/>
  34. <input type="button" value="prompt" onclick="doPrompt()"/><br/>
  35. <input type="button" value="getList" onclick="getList()"/><br/>
  36. <div id="result"></div>
  37. </body>
  38. </html>

<html> <head> <script type="text/javascript"> function doAlert() { alert("hello!"); } function doConfirm() { confirm("are you sure?"); } function doPrompt() { var val = prompt("what's your name?"); if (val) { alert("your name is:" + val); } } function getList() { //使用java和javascript的接口bridge的方法获取集合 var list = window.bridge.getList(); var result = document.getElementById("result"); for (var i = 0; i < list.size(); i++) { var div = document.createElement("div"); div.innerHTML = list.get(i).toString(); result.appendChild(div); } } function success(msg) { alert(msg); } </script> </head> <body background="black"> <input type="button" value="alert" οnclick="doAlert()"/><br/> <input type="button" value="confirm" οnclick="doConfirm()"/><br/> <input type="button" value="prompt" οnclick="doPrompt()"/><br/> <input type="button" value="getList" οnclick="getList()"/><br/> <div id="result"></div> </body> </html>

WebView的优点还不止这些,希望在今后的时间里,再和大家分享WebView的相关技术,也希望这篇文章能够对初识WebView的朋友们带来帮助。

<!-- Baidu Button BEGIN -->

浅谈WebView的使用相关推荐

  1. 转 Android开发学习笔记:浅谈WebView

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...

  2. 浅谈WebKit之Port

    WebKit作为一个浏览器引擎,其相对于Gecko而言一个较大的特点就是便于移植,嵌入到其他程序中,目前大家已了解使用WebKit引擎的应用包括Safari.iPhone.Chrome.Android ...

  3. 浅谈Hybrid技术的设计与实现【转】

    https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术 ...

  4. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹--落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  5. 浅谈分布式架构搭建-理论知识

    浅谈分布式架构搭建 基础 理念 技术选型 后端技术设计 总体架构设计 关键案例设计 架构师搭建架一般优先考虑的是安全性.稳定性.高吞吐量.哈哈,菜鸟的我让我装个B,回忆一下以前架构搭建 基础 理念 C ...

  6. 跨平台开发解决方案浅谈

    跨平台开发解决方案浅谈 前言 本文所讨论技术都是基于大前端生态下的 本文所指跨平台概念无特殊说明时泛指跨安卓和ios 用前端工程化技术开发出app也是本文所讲重点 作为用户来说,当然希望使用App的时 ...

  7. iOS 3D Touch浅谈

    一.什么是3D Touch? 3D Touch是iPhone 6s推出的一种可以让你与手机进行互动的全新方式.除了轻点.轻扫.双指开合这些熟悉的 Multi‑Touch 手势之外,3D Touch 还 ...

  8. (转)浅谈Hybrid技术的设计与实现

    转载地址:https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hyb ...

  9. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

最新文章

  1. fsck.ext3: Unable to resolve 'LABEL=/design'
  2. preempt_count详解
  3. k8s kustomize 简明教程:安装 kustomization.yml常用字段解读
  4. mvn导入jar到库命令
  5. 一文吃透PHP和HTML的嵌套写法
  6. ROS 基础: 在同一个节点里订阅和发布消息
  7. Git的使用教程(三)
  8. 问题 L: The 3n + 1 problem
  9. CentOS安装QQ2012
  10. 黄聪:wordpress向mysql字段中保存html代码(使用add_option()方法),然后无法显示出问题...
  11. 【优化算法】混沌博弈优化算法(CGO)【含Matlab源码 1803期】
  12. Cadence Allegro智能创建PCB封装库
  13. LCL三相pwm整流器(逆变器)
  14. 井字游戏 Tic Tac Toe
  15. TMS320F28335 - eCAP、eQEP
  16. 信号完整性(SI)电源完整性(PI)学习笔记(二十七)S参数在信号完整性中的应用(二)
  17. 在电脑上限制他人网速--需要同一个区域网
  18. android手机霍尔开关的介绍
  19. mixed content the site was loaded over a secure connection but the file at was loaded over an insecu
  20. JAVA简单实现Excel导入/导出 以及excel样式设置!

热门文章

  1. Java并发之AQS同步器学习
  2. linux上用selenium登录新浪微博,获取用户关注的用户id
  3. spark源码分析之任务调度篇
  4. 处理PHP字符串的10个简单方法
  5. 在WinForm中屏蔽中文输入法
  6. FAT32,EXFAT,FAT16和FAT12的所有信息
  7. struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
  8. PHP Object对象转换为Array数组
  9. 大公司病?记改一个文字颜色的过程
  10. CodeSmith模板(生成实体类)