Android开发之webview和 js 互调

来源:互联网 发布:rsc数据库 编辑:程序博客网 时间:2024/04/27 06:26

一、前言

在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的javascript进行交互,Android也对交互做了很好的封装,所以很容易实现例如:点击网页中的按钮Android调用原生对话框,点击网页中的电话号码调用Android拨号APP。这篇给大家介绍下如何实现Android与HTML+JS的交互。

有的人可能不理解什么是javascript,可以简单理解为它在HTML中的作用就相当于你在java中写的函数(方法)差不多。

本篇主要实现的功能点:

  • Android 调用HTML中的javascript脚本
  • HTML中的javascript脚本调用Android本地代码
  • Android 调用HTML中的javascript脚本并传递参数
  • HTML中的javascript脚本调用Android本地代码并传递参数
实现Android调用JS脚本是非常简单的,直接Webview调用loadUrl方法,里面是JS的方法名,并可以传入参数,javascript:xxx()方法名需要和JS方法名相同

实现JS调用Android方法,需要在Java代码中添加下面这句,webview绑定javascriptInterface,js脚本通过这个接口来调用java代码, 第一个参数是自定义类对象,映射成JS对象,这里我直接传this,第二个参数是别名,JS脚本通过这个别名来调用java的方法,这个别名跟HTML代码中也是对应的。

二、项目展示

三、解析流程

asserts/ html代码

<html><head>    <meta http-equiv="Content-Type" content="text/html;charset=gb2312">    <script type="text/javascript">function javacalljs(){     document.getElementById("content").innerHTML =         "<br\>JAVA调用了JS的无参函数";}function javacalljswith(arg){     document.getElementById("content").innerHTML =         ("<br\>"+arg);}    </script></head><body>HTML 内容显示 <br/><h1>    <div id="content">上部分是测试android调用js,中间部分是测试js中传递网址参数并打开</div></h1><br/><input type="button" value="点击调用java代码" onclick="window.android.startFunction()"/><br/><input type="button" value="点击调用java代码并传递参数"       onclick="window.android.startFunction('点击打开网页')"/></body></html>

MainActivity.class

public class MainActivity extends AppCompatActivity {    private WebView contentWebView;    private String path;    private String path1; @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        contentWebView = (WebView) findViewById(R.id.webview);        path = Environment.getExternalStorageDirectory() + "/File/toy/a.html";        path1 = Environment.getExternalStorageDirectory() + "/abc.html";        // 启用javascript        contentWebView.getSettings().setJavaScriptEnabled(true);        // 从assets目录下面的加载html        contentWebView.loadUrl("file:///android_asset/web.html");        contentWebView.addJavascriptInterface(MainActivity.this,"android");        //Button按钮 无参调用HTML js方法        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 无参数调用 JS的方法                  contentWebView.loadUrl("javascript:javacalljs()");            }        });        //Button按钮 有参调用HTML js方法        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 传递参数调用JS的方法                contentWebView.loadUrl("javascript:javacalljswith(" + "'http://blog.csdn.net/Leejizhou'" + ")");            }        });    }    //由于安全原因 targetSdkVersion>=17需要加 @JavascriptInterface     //JS调用Android JAVA方法名和HTML中的按钮 onclick后的别名后面的名字对应    @JavascriptInterface    public void startFunction(){        runOnUiThread(new Runnable() {            @Override            public void run() {                Toast.makeText(MainActivity.this,"js中调用android中,点击调用java代码",3000).show();            }        });    }    @JavascriptInterface    public void startFunction(final String text){        runOnUiThread(new Runnable() {            @Override            public void run() {                new AlertDialog.Builder(MainActivity.this).setTitle("标题").setPositiveButton("网页2", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        mWebview2.clearFormData();                        mWebview2.loadUrl("file://" + path1);                    }                }).setNegativeButton("网页1", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        mWebview2.clearFormData();                        mWebview2.loadUrl("file://" + path);                    }                }).setMessage(text).show();            }        });    }}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公众号验证没有对公账户怎么办 qq密码忘记了怎么办手机绑定没有 我的扣扣怎么申诉都找不回来怎么办 装修装的不好又没有签合同怎么办 日本免税的零食不小心拆了怎么办 闲鱼同意买家退货了买家不退怎么办 手机里淘宝钱付了不发货怎么办 百度云下载手机储存空间不足怎么办 苹果8的照片储存空间满了怎么办 为什么下载的软件已停止运行怎么办 苹果手机刷机忘记注册邮箱了怎么办 刺激战场模拟器注册已达上限怎么办 用模拟器玩刺激战场注册上限怎么办 微信解除实名认证后退款怎么办 苹果为什么qq收消息有延迟怎么办 qq忘记密码手机号也换了怎么办 扣扣空间圈人时照片服务错误怎么办 删了qq好友怎么找回来怎么办 苹果5s语音控制打开了怎么办 lv迷你水桶包肩带长了怎么办 在香港买个lv包包过海关怎么办 国际快递手表被海关查应该怎么办 把档案放到人才市场后报到证怎么办 皮表带带久了有异味怎么办 英语中用词不当和拼写错误怎么办 爬楼梯的购物车车轮坏了怎么办? 帮别人买东西不给我钱怎么办 老师念错名字有同学指出来你怎么办 老公婚前买的房子婆婆想霸占怎么办 我想查我的基金收益情况怎么办 儿童票买好了但大人退票了怎么办 没有享受到国家政策的农民怎么办? 股票涨了没抛然后一直跌怎么办 苹果手机放久了开不了机怎么办 部门要辞退你你不想走该怎么办 口头说辞职现在又不想走了怎么办 网上买的理财不给退本金怎么办 买东西遇到态度不好的人你会怎么办 app在下载东西时被停用了怎么办 买东西填错地址 但已签收怎么办 网购手机受骗后电话打不通怎么办