Android WebView与js交互
来源:互联网 发布:linux vncviewer使用 编辑:程序博客网 时间:2024/05/16 19:15
一.概述
在Android开发中,我们一般使用webview加载网页,当内容加载出来以后,当我们点击webview中的内容时,可能会需要调用本地的功能,这就要涉及到WebView和js的交互了,今天来看看如何实现。先给出效果图
二.实现
首先在清单文件中添加访问网络的权限
<uses-permission android:name="android.permission.INTERNET"/>
然后是我们的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.webviewdemo.MainActivity"> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <Button android:id="@+id/usejs" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="click" android:text="调用html中的js方法" /> <Button android:id="@+id/reload" android:onClick="click" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="重新加载html" /></LinearLayout>
然后在代码中添加webview对js的支持,默认是不支持的,所以必须添加
webView = (WebView) findViewById(R.id.webview); //加上这句话才能使用JavaScript webView.getSettings().setJavaScriptEnabled(true);
准备工作做好了,接下来我们先看看如何在java中调用js中的方法,
1.先创建一个测试用的html文件,
<html><head><script type="text/javascript">function updateHtml(){ document.getElementById("content").innerHTML = "你通过 android 中的控件调用了html 中js 的方法";}</script></head><body>this is my html <a onClick="window.login.startFunction()" href="";>调用java中个的方法</a><span id="content"></span></body></html>
把上面的代码保存为demo.html,保存在android项目的assets下,上面的代码中,包含了一个js方法,下面我们看看如何在activity中调用
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); //加载assets目录下的html文件 webView.loadUrl("file:///android_asset/demo.html"); } public void click(View view){ switch (view.getId()){ case R.id.usejs: //调用js中的方法 webView.loadUrl("javascript:updateHtml()"); break; } }
是不是很简单啊,我们在来看看js如何调用java方法:
首先我们添加一个包含被调用方法的对象到js中
//第一个参数为包含被js调用方法所在的对象,第二个参数为别名,在js中调用会使用webView.addJavascriptInterface(new JavaScriptInterface(),"login");
对象以及方法定义如下
public class JavaScriptInterface{ @JavascriptInterface public void startFunction(){ AlertDialog.Builder ab=new AlertDialog.Builder(MainActivity.this); ab.setTitle("提示"); ab.setMessage("通过js 调用了 java 中的方法"); ab.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); ab.create().show(); } }
那么这个方法怎么被调用,我们可以注意到在html代码中我们给”调用java中个的方法”这个文字添加了点击事件,是怎么写的呢?
window.login.startFunction()
没错,就是这样调用的,window.别名.方法名,这个别名是我们在addJavascriptInterface这个方法的第二个参数定义的,
然后还有什么调用方式吗?在效果图在可以看到我们点击了第二个按钮后,也出现了js调用本地方法的效果,如何实现呢,代码如下
webView.loadUrl("javascript:window.login.startFunction()");
好了,两种调用方式都讲完了,现在总结一下,
1.java调用js方法
webView.loadUrl(“javascript:方法名”);,这个方法名称是定义在html的js中的
2.js调用java方法
webView.loadUrl(“javascript:window.别名.方法名”);,别名是我们定义在addJavascriptInterface这个方法的第二个参数,方法名使我们本地的一个方法,包含在addJavascriptInterface第一个参数对象的里面。
最后,给出完整代码,供大家学习参考
public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("file:///android_asset/demo.html"); webView.addJavascriptInterface(new JavaScriptInterface(),"login"); } public void click(View view){ switch (view.getId()){ case R.id.reload: webView.loadUrl("javascript:window.login.startFunction()"); break; case R.id.usejs: webView.loadUrl("javascript:updateHtml()"); break; } } public class JavaScriptInterface{ @JavascriptInterface public void startFunction(){ AlertDialog.Builder ab=new AlertDialog.Builder(MainActivity.this); ab.setTitle("提示"); ab.setMessage("通过js 调用了 java 中的方法"); ab.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); ab.create().show(); } }}
- Android WebView与JS交互
- Android webview与js交互
- Android WebView与Js交互
- Android WebView与js交互
- Android webview与js交互
- Android webview 与js交互
- android webview与js交互
- Android webview与js交互
- android webview与js交互
- Android WebView与js交互
- android webView与js交互
- WebView---android webview组件如何使用 Webview与js交互
- WebView---android webview组件如何使用 Webview与js交互
- Android WebView 与JS的数据交互
- Android WebView 与JS的数据交互
- Android 的webview与js交互
- android中的WebView与JS交互
- android webview 与 js 交互 总结
- 网站性能优化之黄金守则
- android中viewPager双层嵌套问题,子viewpager无法滑动和滑动父级viewpager后子viewpager不显示内容
- oracle索引导致的查询记录为0的案例
- 在Ubuntu上U盘文件只读且无法删除怎么办
- 遇见LEANGOO
- Android WebView与js交互
- (二)Docker run 运行第一个容器
- ubuntu 14.04开机出现错误“Error found when loading /root/.profile”解决
- 1107. Social Clusters (30)
- Oracle用户频繁被锁原因排查与解决
- grep,sed, awk实例应用总结
- ClickOnce部署DotNETFrameWork流程及注意事项
- Codefores #185E (div1) Biologist
- Robot Operating System(ROS)入门教程