Android之webview与js交互

举报
chenyu 发表于 2021/07/26 23:54:58 2021/07/26
【摘要】 对于android初学者应该都了解webView这个组件。之前我也是对其进行了一些简单的了解,但是在一个项目中不得不用webview的时候,发现了webview的强大之处,今天就分享一下使用webview的一些经验。   1、首先了解一下webview。 webview介绍的原文如下:A View that displays web pages. Th...

对于android初学者应该都了解webView这个组件。之前我也是对其进行了一些简单的了解,但是在一个项目中不得不用webview的时候,发现了webview的强大之处,今天就分享一下使用webview的一些经验。

 

1、首先了解一下webview。

webview介绍的原文如下:A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.

从上面你应该了解到了基本功能,也就是显示网页。之所以我说webview功能强大是因为它和js的交互非常方便,很简单就可以实现。

 

2、webview能做什么?

①webView可以利用html做界面布局,虽然目前还比较少人这么使用,不过我相信当一些客户端需要复杂的图文(图文都是动态生成)混排的时候它肯定是个不错的选择。

②直接显示网页,这功能当然也是它最基本的功能。

③和js交互。(如果你的js基础比java基础好的话那么采用这种方式做一些复杂的处理是个不错的选择)。

 

3、如何使用webview?

这里直接用一个svn上取下的demo,先上demo后讲解。demo的结构图如下:


WebViewDemo.java


  
  1. package com.google.android.webviewdemo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.util.Log;
  6. import android.webkit.JsResult;
  7. import android.webkit.WebChromeClient;
  8. import android.webkit.WebSettings;
  9. import android.webkit.WebView;
  10. /**
  11. * Demonstrates how to embed a WebView in your activity. Also demonstrates how
  12. * to have javascript in the WebView call into the activity, and how the activity
  13. * can invoke javascript.
  14. * <p>
  15. * In this example, clicking on the android in the WebView will result in a call into
  16. * the activities code in {@link DemoJavaScriptInterface#clickOnAndroid()}. This code
  17. * will turn around and invoke javascript using the {@link WebView#loadUrl(String)}
  18. * method.
  19. * <p>
  20. * Obviously all of this could have been accomplished without calling into the activity
  21. * and then back into javascript, but this code is intended to show how to set up the
  22. * code paths for this sort of communication.
  23. *
  24. */
  25. public class WebViewDemo extends Activity {
  26. private static final String LOG_TAG = "WebViewDemo";
  27. private WebView mWebView;
  28. private Handler mHandler = new Handler();
  29. @Override
  30. public void onCreate(Bundle icicle) {
  31. super.onCreate(icicle);
  32. setContentView(R.layout.main);
  33. mWebView = (WebView) findViewById(R.id.webview);
  34. WebSettings webSettings = mWebView.getSettings();
  35. webSettings.setSavePassword(false);
  36. webSettings.setSaveFormData(false);
  37. webSettings.setJavaScriptEnabled(true);
  38. webSettings.setSupportZoom(false);
  39. mWebView.setWebChromeClient(new MyWebChromeClient());
  40. mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
  41. mWebView.loadUrl("file:///android_asset/demo.html");
  42. }
  43. final class DemoJavaScriptInterface {
  44. DemoJavaScriptInterface() {
  45. }
  46. /**
  47. * This is not called on the UI thread. Post a runnable to invoke
  48. * loadUrl on the UI thread.
  49. */
  50. public void clickOnAndroid() {
  51. mHandler.post(new Runnable() {
  52. public void run() {
  53. mWebView.loadUrl("javascript:wave()");
  54. }
  55. });
  56. }
  57. }
  58. /**
  59. * Provides a hook for calling "alert" from javascript. Useful for
  60. * debugging your javascript.
  61. */
  62. final class MyWebChromeClient extends WebChromeClient {
  63. @Override
  64. public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
  65. Log.d(LOG_TAG, message);
  66. result.confirm();
  67. return true;
  68. }
  69. }
  70. }

demo.html


  
  1. <html>
  2. <script language="javascript">
  3. /* This function is invoked by the activity */
  4. function wave() {
  5. alert("1");
  6. document.getElementById("droid").src="android_waving.png";
  7. alert("2");
  8. }
  9. </script>
  10. <body>
  11. <!-- Calls into the javascript interface for the activity -->
  12. <a onClick="window.demo.clickOnAndroid()"><div style="width:80px;
  13. margin:0px auto;
  14. padding:10px;
  15. text-align:center;
  16. border:2px solid #202020;" >
  17. <img id="droid" src="android_normal.png"/><br>
  18. Click me!
  19. </div></a>
  20. </body>
  21. </html>

main.xml


  
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:orientation="vertical"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. >
  6. <TextView
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="@string/intro"
  10. android:padding="4dip"
  11. android:textSize="16sp"
  12. />
  13. <WebView
  14. android:id="@+id/webview"
  15. android:layout_width="fill_parent"
  16. android:layout_height="0dip"
  17. android:layout_weight="1"
  18. />
  19. </LinearLayout>

4、如何交互?

①android如何调用js。

调用 形式:

mWebView.loadUrl("javascript:wave()");
 

其中wave()是js中的一个方法,当然你可以把这个方法改成其他的方法,也就是android调用其他的方法。

②js如何调用android。

调用形式:

<a onClick="window.demo.clickOnAndroid()">
 
代码中的“demo”是在android中指定的调用名称,即

mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
 

代码中的clickOnAndroid()是“demo”对应的对象:new DemoJavaScriptInterface() 中的一个方法。

③双向交互。

当然是把前面的两种方式组合一下就可以了。

 

5、讲解demo。

现在你一定了解了android和js的交互了。是时候分析一些demo了,根据上面讲的你也应该比较清楚了。具体交互流程如下:

①点击图片,则在js端直接调用android上的方法clickOnAndroid();

②clickOnAndroid()方法(利用线程)调用js的方法。

③被②调用的js直接控制html。






文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/48713523

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。