webview的JS交互

来源:互联网 发布:apache 字段长度 编辑:程序博客网 时间:2024/04/30 13:21

1、在android项目中,用webview加载html是经常出现的,如果html的内容无法响应application的话,那将会出现很多局限性,所以就有了webview与JS的交互,首先,是activity里面的webview与JS交互。在activity中为webview添加支持JS的代码:

webview.getSettings().setJavaScriptEnabled(true); 

然后给webview指定一个方法,供html调用,其中,open_view就是一个标识符,html识别app的标识符。

webview.addJavascriptInterface(DetailChoose.this, "open_view"); 

然后在activity中写一个方法,method也是一个标识符,可供html调用,str1是html传过来的参数,href是定义在html里面的,给app识别的标识符,然后在activity中响应html的动作跳转activity,并将str2传到另一个activity中,完成JS交互跳转activity的功能。

public void method(String str1) {        String str2 = "http://www.baidu.com" + str1;        Intent intent = new Intent();        intent.putExtra("href", str2);        intent.setClass(DetailChoose.this, Goodsdetail.class);        startActivity(intent);    } 

在JS中添加以下代码,.open_view是html里面的a标签,给a标签一个点击事件并执行app的函数,同时传参数。

if_open = typeof(open_view);        if(if_open != "undefined") {        $('.open_view').click(function(){                open_view.method($(this).attr('href'));                return false;        })    } 

最后记得在html中加上JS,即,

<script type="text/javascript" src="js/js.js"></script>

2、但一个界面不仅仅只有一个界面时,而是需要在一个activity里面切换多个界面时,则可以在activity里面添加多个fragment,然而,fragment虽然依赖与activity,但是却有着自己的生命周期,fragment中加载webview的JS交互不同与activity的JS交互,但是也大同小异。
在activity中写一个函数:

public void show(final int i) {        new Handler().postDelayed(new Runnable() {            @SuppressLint("NewApi")            @Override            public void run() {                switch (i) {                case 0:                    webview = (WebView) synthesizeFragment.getView().findViewById(R.id.webview);                    webview.getSettings().setJavaScriptEnabled(true);                    webview.addJavascriptInterface(ThreeActivity.this, "open_goods");                    break;                case 1:                    webview1 = (WebView) chooseFragment.getView().findViewById(R.id.webview);                    webview1.getSettings().setJavaScriptEnabled(true);                    webview1.addJavascriptInterface(ThreeActivity.this, "open_goods");                    break;                default:                    break;                }                }            }, i);    }

这里需要用到子线程,不然会报错,fragment与activity不同的是需要在activity找到fragment中的控件,找到控件之后,其他的交互的跟activity一样,记得线程最后得用i而不能用0。然后将这个方法写在每个fragment实例化之后,用show(i);的方式。

0 0
原创粉丝点击