这段时间很多小伙伴问我关于android与js交互的相关问题,索性就开一贴与大家交流一下
现在市面上的app大致分为三类,纯原生的、html套壳的、原生与html混编的,前两个就不说了,最后一个原生与html混编势必会用到android与js的数据交互,即webview控件的使用。
现在来看一下方法吧
首先要记得开启网络权限
<uses-permission android:name="android.permission.INTERNET" />
然后使用webview控件
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="传值给html" />
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
</WebView>
这里面包含的样式根据布局自定义的,你们在使用时不用理会,只要有webview控件就ok
然后在Activity中编写代码:
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);//开启js使用权限
webView.getSettings().setDefaultTextEncodingName("GBK");//开启中文编码,不过好像不写也没事
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);//设置网页的滚动条样式,这个样式是不占用屏幕空间
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) { //监听页面加载进度
if (newProgress == 100) {//页面加载完之后的操作
}
super.onProgressChanged(view, newProgress);
}
});
webView.addJavascriptInterface(new AndroidAndJs(WebViewActivity.this),"android2js");//加入交互的接口,AndroidAndJs是自定义的一个类,"android2js"是自定义的类名(在js中使用)
webView.loadUrl("file:///android_asset/test.html");//加载网页
以上代码注释很清晰,需要注意的是,如果加载http的网页,而里面引用了https的超链接文件,比如图片,那么在5.0以上的版本是无法显示图片的,因为5.0以上的版本默认关闭http与https的混合模式,所以,如果有这方面需求的,可以将它开启
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //如果当前版本大于5.0时
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//开启http与https的混合模式
}
如果无法识别Build.VERSION_CODES.LOLLIPOP
,那就将它改成它的常量值“21”。
AndroidAndJs类
新建一个专门用于与js交互的自定义类AndroidAndJs
public class AndroidAndJs {
Context context;
public AndroidAndJs(Context context) {
this.context = context;
}
@JavascriptInterface
public void showMsg(String str) {
Toast.makeText(context,str,Toast.LENGTH_SHORT).show();
}
ç
public String getInfo(){
return "我是从手机原生过来滴~";
}
}
有一点要注意的是,需要js调用的方法一定要在方法名上加注解@JavascriptInterface
,不然无法执行
HTML页
新建一个html 页,暂且命名为“test.html”,布局如下图
js代码
<script type="text/javascript" src="jquery-1.11.2.min.js" ></script>
<script type="text/javascript">
function set(){
var text=$("#text").val();
window.android2js.showMsg(text);
}
function get(){
$("#content").html(window.android2js.getInfo());
}
function toAndroid(){
$("#content").html("调用了toAndroid()");
}
</script>
里面包含三个函数体,set()是将html页文本框的内容传给android,get()是获取android的数据,toAndroid()是预留的android中的按钮调用的方法
android调用js方法为:
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
webView.loadUrl("javascript:toAndroid()");
}
});