Android与Js调用
随着html5
的发展,android
原生应用与h5
的结合已经越来越多。android与js之间的相互调用
也变得越来越频繁。啦啦啦,今天就来写一个简单的列子记录记录。
实列
我们新建一个项目JSBridge
。
1.编写activity_main
。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.jokerchan.jsbridge.MainActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/clickjs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="android调用js" android:textColor="#000000" /> <EditText android:id="@+id/showjs" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@id/clickjs" android:hint="请输入内容" /> RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" > <EditText android:id="@+id/jsshow" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#000000" android:textSize="16sp" android:editable="false" android:hint="这是JS调用android的方法" /> RelativeLayout> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" />LinearLayout>
布局文件很简单,主要是按钮和显示的部分,其中最重要的有一个webview
用来展示网页内容。
2.编写本地html
文件
我们建立一个joker.html
然后编写一个简单的html
内容如下
<html xmlns="http://www.w3.org/1999/html"><head>head><body><script> //js调用android程序中的方法 function jsGetAndroid(){ var msg = androidjs.showInfoFromJs("I'M FROM JS!!!"); document.getElementById("androidgetjs").innerHTML=msg; } //android程序中调用js的方法 function androidGetJs(msg){ document.getElementById("androidgetjs").innerHTML="来自Android的消息:"+msg; }script><button id="jsgetandroid" onclick="jsGetAndroid()">点我调用android方法button>br><div id="androidgetjs">div>br><div id="fromandroid">div>body>html>
其中里面包含了几个显示控件和两个js
函数,这也先不解释。会html
的人看一眼就知道了。
3.编写activity
中代码。
/** * android 和JS的交互简单使用 * * @author jokerchan * @version 1.0 * @since 2016年4月14日 14:53:51 * SuppressLint一定要加上去!!! * 低版本可能没问题,高版本JS铁定调不了Android里面的方法 */@SuppressLint("SetJavaScriptEnabled")public class MainActivity extends AppCompatActivity { private WebView webview; EditText showjs; EditText jsshow; Button clickjs; @SuppressLint("JavascriptInterface") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webview = (WebView) findViewById(R.id.webview); showjs = (EditText) findViewById(R.id.showjs); jsshow = (EditText) findViewById(R.id.jsshow); clickjs = (Button) findViewById(R.id.clickjs); webview.getSettings().setDefaultTextEncodingName("utf-8"); webview.getSettings().setJavaScriptEnabled(true); webview.addJavascriptInterface(new JavaScriptInterface(this), "androidjs"); webview.loadUrl("file:///android_asset/joker.html"); clickjs.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String msg = showjs.getText().toString().trim(); webview.loadUrl("javascript:androidGetJs('" + msg + "')"); } }); } public class JavaScriptInterface { Context context; JavaScriptInterface(Context context) { this.context = context; } //在js中调用 androidjs.showInfoFromJs("I'M FROM JS!!!")就会出发此方法 @JavascriptInterface public String showInfoFromJs(final String name) { runOnUiThread(new Runnable() { @Override public void run() { jsshow.setText(name); } }); return "I'M FROM ANDROID!!!"; } }}
其中注意@SuppressLint("SetJavaScriptEnabled")
一定要加上,以前做项目的时候也被坑过。
Android调用Js
首先我们对webview进行一些设置
。
//设置编码为utf-8webview.getSettings().setDefaultTextEncodingName("utf-8");//设置javascript支持webview.getSettings().setJavaScriptEnabled(true);//添加js接口webview.addJavascriptInterface(new JavaScriptInterface(this), "androidjs");//加载htmlwebview.loadUrl("file:///android_asset/joker.html");
然后我们在html
中定义了一个js
方法。和一个显示信息的div
//android程序中调用js的方法 function androidGetJs(msg){ document.getElementById("androidgetjs").innerHTML="来自Android的消息:"+msg; } "androidgetjs">div>
然后我们获取edittext
里面的值并点击按钮调用js
里面的方法
clickjs.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String msg = showjs.getText().toString().trim(); webview.loadUrl("javascript:androidGetJs('" + msg + "')"); }});
可以看见只需要webview.loadUrl("javascript:androidGetJs('" + msg + "')")
简单一句就可以调用js
里面的方法。javascript:
后面跟的androidGetJs
就是js
里面定义的方法。然后我们讲android
传递过去的值显示在了div
上,效果如图。
Js调用Android
看这句代码webview.addJavascriptInterface(new JavaScriptInterface(this), "androidjs")
其中有一个JavaScriptInterface
对象,后面是一个字符组androidjs
这个androidjs
就是等会在js
中调用android
方法的时候会用到的,不然会找不到方法。
下面看看JavaScriptInterface
的实现
public class JavaScriptInterface { Context context; JavaScriptInterface(Context context) { this.context = context; } //在js中调用 androidjs.showInfoFromJs("I'M FROM JS!!!")就会出发此方法 @JavascriptInterface public String showInfoFromJs(final String name) { runOnUiThread(new Runnable() { @Override public void run() { jsshow.setText(name); } }); return "I'M FROM ANDROID!!!"; }}
因为js
调用android
方法不再ui
线程。所以更新的时候用了runOnUiThread
。其中showInfoFromJs
就是js
中要调用的方法。记得在方法前加上@JavascriptInterface
。然后在看看js
代码。
//js调用android程序中的方法function jsGetAndroid(){ var msg = androidjs.showInfoFromJs("I'M FROM JS!!!"); document.getElementById("androidgetjs").innerHTML=msg;}"androidgetjs">div>
在js
中用了androidjs.showInfoFromJs("I'M FROM JS!!!")
调用android
的方法。其中androidjs
就是先前在java
代码中定义那个字段。这里一定要对应。然后将showInfoFromJs
的返回值显示在div
中。
显示如图:
提醒
别忘记在manifest
中加入网络权限。
到此android
和js
之间的相互调用就完了。
作者:阿祥JOKER
链接:https://www.jianshu.com/p/cb928de89d49
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
更多相关文章
- Android(安卓)自定义View控件,实现跟随手指触摸移动的小球
- Android(安卓)Studio 一个module引用另一个模块module的方法
- Android总结(基础篇)-骚人文客
- NDK(1)--体验NDK
- Android(安卓)中Parcelable的作用 (转载)
- Android设置Toast长时间显示,及AlertDialog的使用
- android 自定义View过程解析
- Android解决TextView setText显示乱码
- 关于Android(安卓)NDK如何成功调用stl的使用分析