android中利用webview调用网页上的js代码 Java代码调用js并传递参数

1.android中利用webview调用网页上的js代码。

Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("javascript:test()");// 调用js函数
mWebView.loadUrl("file:///android_asset/index.html");// 调用本地assets目录下的html文件,也可以直接调用网上的html文件。
  1. 网页上调用android中java代码的方法

在网页中调用java代码,需要在webview控件中添加javascriptInterface。如下所示:

mWebView.addJavascriptInterface(
    new Object() { 
            public void clickOnAndroid() { 
                mHandler.post(new Runnable() { 
                    public void run() { 
                        Toast.makeText(Test.this, "测试调用java", Toast.LENGTH_LONG).show();
                    } 
                }); 
            } 
        }, "demo"); //demo是对象名

在网页中,只需要像调用js方法一样,进行调用就可以

<div id='b'><a onclick="javascript:window.demo.clickOnAndroid()">b.c</a></div>

网页加载立即调用

<body onload="javascript:window.demo.clickOnAndroid()">
  1. Java代码调用js并传参

首先需要带参数的js函数,如function test(str),然后只需在调用js时传入参数即可,如下所示:

mWebView.loadUrl("javascript:test('" + aa+ "')"); //aa是js的函数test()的参数

4.Js中调用java函数并传参

首先一样需要带参数的函数形式,但需注意此处的参数需要final类型,即得到以后不可修改,如果需要修改其中的值,可以先设置中间变量,然后进行修改。如下所示:

mWebView.addJavascriptInterface(
    new Object() { 
            public void clickOnAndroid(final int i) { 
                mHandler.post(new Runnable() { 
                    public void run() { 
                                int j = i;
                                j++;
Toast.makeText(Test.this, "测试调用java" + String.valueOf(j), Toast.LENGTH_LONG).show();
                    }
                });
            } 
        }, "demo");

然后在html页面中,利用如下代码

<div id='b'><a onclick="window.demo.clickOnAndroid(2)">b.c</a></div>,即可实现调用
ps:WebView加jquery
public class MainActivity extends Activity {
   private static final String TAG = "MainActivity";

   // 定义访问的链接
   private static String URL = "file:///android_asset/index.html";

   // 定义WebView
   WebView mWebView = null;

   // 定义数据列表
   private List<Program> programList = null;
   private static final int PROGRAM_NUM = 25;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       // 在标题栏上显示进度
       getWindow().requestFeature(Window.FEATURE_PROGRESS);

       // 创建WebView对象
       mWebView = new WebView(this);
       setContentView(mWebView);

       final Activity activity = this;
       // 在标题栏显示进度
       mWebView.setWebChromeClient(new WebChromeClient() {
           public void onProgressChanged(WebView view, int progress) {
               activity.setProgress(progress * 100);
           }
       });

       programList = initProgramList();

       // 设置JS可用
       mWebView.getSettings().setJavaScriptEnabled(true);
       // 把programList添加到js的全局对象window中,
       // 这样就可以使用window.programList来获取数据
       mWebView.addJavascriptInterface(programList, "programList");
       mWebView.addJavascriptInterface(this, "MainActivity");

       // 加载页面
       mWebView.loadUrl(URL);
   }

   /*
    * 定义js回调java函数
    */
   public void showSelect(int id) {
       Log.i(TAG, "select:" + id);
   }

   // 绑定键盘的向上,向下按钮事件触发相应的js事件
   @Override
   public boolean onKeyDown(int keyCode, KeyEvent event) {
       if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
           mWebView.loadUrl("javascript:moveUp()");
           return true;
       }
       if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
           mWebView.loadUrl("javascript:moveDown()");
           return true;
       }
       return super.onKeyDown(keyCode, event);
   }

   // 初始化数据
   private List initProgramList() {
       List<Program> list = new ArrayList<Program>();
       for (int i = 1; i <= PROGRAM_NUM; i++) {
           Program p = new Program(i, "Program:::" + i);
           list.add(p);
       }
       return list;
   }

   /*
    * 定义简单的数据类
    */
   class Program {
       private int id;
       private String name;

       public Program(int id, String name) {
           this.id = id;
           this.name = name;
       }

       public int getId() {
           return id;
       }

       public void setId(int id) {
           this.id = id;
       }

       public String getName() {
           return name;
       }

       public void setName(String name) {
           this.name = name;
       }
   }

对应的html文件:

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.js"></script>
<script>
    var startTop = 120;
    var startPos = 1;
    var totalNum = 0;
    var itemHeight = 40;
    $(document).ready(function(){
        var con = '';
        if(window.programList){
            //初始化页面
            totalNum = window.programList.size();
            for(i=0;i< totalNum;i++){
                con+='<div class="item" tar="'+programList.get(i).getId()+'">'+programList.get(i).getName()+'</div>';
            }
        }
        
        $('#list').html(con);
        //绑定事件
        $('.item').click(function(){
            var tar = $(this).attr('tar');
            //回调java事件
            window.MainActivity.showSelect(tar);
        });
    });
    
    //接收键盘向下事件
    function moveDown(){
        if(startPos < totalNum){
            startPos ++;
            var top = (1 - startPos)* itemHeight + startTop;
            $('#list').stop().animate({top:top});
        }
    }
    //接收键盘向上事件
    function moveUp(){
        if(startPos > 1){
            startPos --;
            var top = (1 - startPos )* itemHeight + startTop;
            $('#list').stop().animate({top:top});
        }
    }
</script>
<style>
    .box{
        position:relative;
        left:20px;
        top:20px;
        width:200px;
        height:280px;
        background-color:#CCC;
        overflow:hidden;
    }
    
    .list{
        position:absolute;
        left:10px;
        top:120px;
        width:180px;
    }
    
    .item{
        height:40px;
        line-height:40px;
    }
    
    .select{
        position:absolute;
        left:4px;
        top:120px;
        border:1px solid #F00;
        height:40px;
        width:190px;
    }
</style>
</head>
<body >
    
    <div class="box">
        <div class="list" id="list">
            
        </div>
        <div class="select">&nbsp;</div>
    </div>
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,389评论 25 707
  • 这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以...
    Shawn_Dut阅读 7,201评论 3 55
  • 今天有个朋友过来找我玩,本来还挺开心的,可是吃了一顿饭,就没什么心思了。坦白讲,我似乎太注重细节了吧? 事情是这样...
    长安牛马走阅读 123评论 0 0
  • 加油吧! 勇敢去追逐那个你还在碰不到的梦! 我想 只有努力与不放弃才会达到那个你想到达的彼岸! 我期待 那个你所未...
    萧瑟几人愁阅读 172评论 0 0
  • 浪漫激情的三个重要因素-幻想,新奇,和唤醒会随着时间减弱。相伴的爱,亲密比激情更稳定。 爱情策略:享受激情,但不要...
    玩儿_温暖阅读 187评论 0 0