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);的方式。