在使用webview时,需要给JS传递一个参数,之前前端同事把JS方法内容和html内容分离了,所以在使用下面的方法的时候一直显示方法未定义[INFO:CONSOLE(1)] "Uncaught ReferenceError: load is not defined", source: (1),后来把JS方法写到html里,这个方法就可以调用了,因为是第一次做这个问题,所以不知道有没有直接调用单独JS文件里的方法 webview不能够正常加载JS的问题可以看我的另一篇文章 http://blog.csdn.net/weixue9/article/details/78324737,调用Js方法并传递参数的具体步骤如下: 通过 WebViewClient 的方法shouldOverrideUrlLoading ()回调拦截 url 具体原理: 1.Android通过 WebViewClient 的回调方法shouldOverrideUrlLoading ()拦截 url 2.解析该 url 的协议 3.如果检测到是预先约定好的协议,就调用相应方法,即JS需要调用Android的方法 具体使用: 步骤1:在JS约定所需要的Url协议 JS代码:javascript.html,以.html格式放到src/main/assets文件夹里
Carson_Ho 点击调用Android代码 当该JS通过Android的mWebView.loadUrl("file:///android_asset/javascript.html")加载后,就会回调shouldOverrideUrlLoading (),接下来继续看步骤2:
步骤2:在Android通过WebViewClient复写shouldOverrideUrlLoading()
public class MainActivity extends AppCompatActivity {
WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
// 设置与Js交互的权限
webSettings.setJavaScriptEnabled(true);
// 设置允许JS弹窗
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
// 步骤1:加载JS代码
// 格式规定为:file:///android_asset/文件名.html
mWebView.loadUrl("file:///android_asset/javascript.html");
// 复写WebViewClient类的shouldOverrideUrlLoading方法
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 步骤2:根据协议的参数,判断是否是所需要的url
// 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)
//假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)
Uri uri = Uri.parse(url);
// 如果url的协议 = 预先约定的 js 协议
// 就解析往下解析参数
if ( uri.getScheme().equals("js")) {
// 如果 authority = 预先约定协议里的 webview,即代表都符合约定的协议
// 所以拦截url,下面JS开始调用Android需要的方法
if (uri.getAuthority().equals("webview")) {
// 步骤3:
// 执行JS所需要调用的逻辑
System.out.println("js调用了Android的方法");
// 可以在协议上带有参数并传递到Android上
HashMap
params = new HashMap<>(); Set collection = uri.getQueryParameterNames(); } return true; } return super.shouldOverrideUrlLoading(view, url); } } 特点 优点:不存在JS代码调用一定要在 onPageFinished() 回调之后才能调用,否则不会调用。; 缺点:JS获取Android方法的返回值复杂。如果JS想要得到Android方法的返回值,只能通过WebView的loadUrl()去执行JS方法把返回值传递回去,相关的代码如下: // Android:MainActivity.java mWebView.loadUrl("javascript:returnResult(" + result + ")"); // JS:javascript.html function returnResult(result){ alert("result is" + result); }
上面的方法是借鉴http://www.jianshu.com/p/345f4d8a5cfa的方法