刚登进来的时候看到博客园的首页好像改了,比之前好看很多了,也希望博客园可以越做越好!加油啊!
最近又对webview进行了一遍扫盲,对于webview和js交互这块理解比之前更深了一点,在这里记录下,以后忘了可以直接翻自己的博客来做。吐槽一下,csdn现状,吵来吵去,标注20年发布的文章,抄的却是人家11年发布的。有时候百度一搜,十几条csdn,一摸一样的内容,有些人抄博客连称呼都不改的。
牢骚发完了,讲讲js交互。
首先要想要交互,就必须允许webview加载js,比较小白的事,但还是要提醒。
webSettings.setJavaScriptEnabled(true);
android和js交互主要是在webview上实现的。怎么使用webview也不多说了,比较基础的东西。贴一下官方的地址。
https://developer.android.google.cn/guide/webapps/webview
这里讲了js怎么调用android的方法。写的也很详细,代码也简单,我就做一个搬运工吧。
public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }
创建一个这样的类,注意,@JavascriptInterface这个,表示js可以调用这个方法。不加的js调用方法的时候会报一个方法不存在的错。
WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android");
这块我把它理解成channel,创建了一个js和webview的通道,然后通道里是js可以调用的方法,“android”这个是通道的标示,要跟js上对应起来。
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script>
直接上对应的js方法,可以看到。Android.showToast即调用webview的showToast方法。(注:这里的Android和前面“Android”是对应的,自己写个demo跑一跑就明白了。)
不过当然还可以在android端去拦截要加载的url来实现方法,这块我给的链接里有,就在下面。我个人不太喜欢这种方法,不太纯粹。这里就不介绍了。
android调用js的方法
上面这些官网都有,我的文笔也不太行,没看明白的可以直接去翻官网。而且百度也能出来一堆。但是接下来讲的,我还没在官网里找到详细介绍的(官网肯定都有,不过介绍的详细与否就不清楚了)
然后自己稍微总结了下。
用的是webview的evaluateJavascript方法。文字描述不如代码来的直接。
String js = String.format("jsFunction(%s",string); webView.evaluateJavascript(js,new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.i("TAG",value+"!!!"); } });
这个就是直接调用js的方法( jsFunction(string) ),这个方法存在js这边,有没有参数,有几个参数都随js这边来定。放参数主要是为了把android这边的数据回调给js。
这样一套组合拳,就可以完成js和android端的交互。当需要调用原生这边的方法的时候,使用第一种方法,并且传参数过去。然后把数据处理完使用第二种方法,再还给js。
还有就是,webview需要处于一个handle之下!!!不然调用方法会报错,要使用的时候把用getMainlooper拿过来。
东西比较简单,mark一下记录自己的成长。