Js代码和Java代码之间的互相调用了
来源:互联网 发布:网络中断应急预案 编辑:程序博客网 时间:2024/05/02 00:43
很多复杂的UI界面,在Android中需要配合大量xml代码和Java代码实现,而使用HTML5可以非常轻松的实现出来,而且具有很好的跨平台特性,让我们不必为了多个平台而重写代码,H5学习成本也较低,上手快。虽然从目前来说H5在Android系统中的速度可能还欠佳一些,但相信随着手机的性能不断的提高,这些问题都会被解决
使用H5开发Android的UI界面,最重要的就是如何实现Js代码和Java代码之间的互相调用了
在讲解之前,让我们先把项目跑起来
效果图:
准备好index.html文件,将它放入Android工程下的assets文件夹中:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
JavaScript的代码我单独写在一个js文件中了,把app.js文件也放入assets文件夹中:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
最后就是Java代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
还有布局代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
一、JavaScript调用Android中的方法
这里实现的场景是点击Web页面中的Button,把input中输入的数据传递给Android系统,并通过Toast显示出来
对应的js代码:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
对应的java代码:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
其中的“contact”其实指的就是我们在java代码中定义的JsObject类
他俩通过以下方法实现绑定:
- 1
- 1
第一个参数传入的是一个java对象,第二参数是指定对应的js里调用该类时需要使用的自定义别名,这个方法的作用就是将一个Java对象和JavaScript联系起来
这里需要注意个问题,在SDK17以上的版本中,google为了安全考虑,只允许js调用带有@JavascriptInterface注解的Java方法,所以我们要给被js调用的java方法前加上@JavascriptInterface注解
二、Android调用JavaScript中的方法
用户点击Android中的Button控件后,传一个json数据给JavaScript方法,js解析json数据后添加一个新的联系人显示在Web页面上
对应的js代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
对应的java代码:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
想要调用JavaScript中的某个方法,使用以下方法的标准格式就可以了:
- 1
- 1
“xxxMethod()”指的是JavaScript中的某个方法,如需调用其它方法,只要把后面的xxxMethod()替换成js中对应的方法就好
三、常见问题
1.Android与js互调不成功
给WebView的setJavaScriptEnabled方法设置为true,使其允许js代码执行
在API高于17的版本上,需要被js调用的java方法前加上@JavascriptInterface
检查js中的别名是否写错,调用java方法时类的别名,一定要是mWebView.addJavascriptInterface(jsobj, “contact”);里面定义的别名
2.网页的alert弹不出
需要重写WebChromeClient中的onJsAlert()方法
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
如果需要把web页面的alert弹出框替换成Android的AlertDialog,可以在onJsAlert()方法里进行重写,并设置return为true
3.Js调用java方法修改UI界面不成功
只要明白这一点:js调用的java方法,其实是运行在另外一个子线程WebViewCoreThread中
测试一下:把以下语句分别放在Activity的onCreate()方法里和被js调用的java方法中
- 1
- 1
当onCreate执行时运行的log:
运行线程name->main
当JsObject类中的方法运行时的log:
运行线程name->WebViewCoreThread
很明显,子线程不允许修改主线程UI,所以我们想通过js调用java代码直接修改UI界面的做法是不被允许的
如果需要修改,可以通过Handler机制去解决
4.如何让手机的返回键跳到上一个Web页面
如果不对手机系统的返回键进行处理,那么我们按返回键会直接关闭当前Activity,而不会回到上一个Web页面
解决这个问题,我们可以重写Activity中的onBackPressed()方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- Js代码和Java代码之间的互相调用了
- 汇编和C代码之间的互相调用
- Android JNI中C和JAVA代码之间的互相调用
- Webview中js与本地java代码的互相调用
- Android和js代码互相调用
- iOS的JS和OC代码互相调用
- QML和C++代码之间互相调用及参数之间的转换
- java和js之间互相调用实践(一)
- android js与本地java代码互相调用
- Cordova2.0(既PhoneGap)中通过Plugin实现Java和JS代码互相调用
- 22.WebBrowser中JS和C++代码互相调用
- 无意之中 实现了个两表互相调用插入触发器的代码
- 整型和二进制之间的互相转换(代码)
- Android与html js代码互相调用
- 两个JS之间的函数互相调用
- C++ 和 lua代码互相调用
- JS与iOS之间的通信 iOS调用JS代码
- JS调用Java代码
- toast
- php导出excel(多种方法)
- 欢迎使用CSDN-markdown编辑器
- Hdu 1161
- 学习FreeRTOS(1):实验环境
- Js代码和Java代码之间的互相调用了
- 学习笔记
- 表格的简单实现_1
- 1
- Leetcode 69. Sqrt(x)
- vs 程序的远程屏幕监控、远程截图、本地截图。
- 得到应用发送与接收的流量
- 155. Min Stack
- Linux汇编练习