android webview调用js完全解析(所有坑都能解决)
16lz
2022-01-16
有道云笔记贴过来的代码有点乱,请参考 原文 webview调用html js完全攻略(所有的疑问都能解答) 设置webSettings //允许h5使用javascript webView.getSettings().setJavaScriptEnabled(true); //允许android调用javascript webView.getSettings().setDomStorageEnabled(true); 设置调用javascript webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { webView.loadUrl("javascript:alert('hello')"); webView.loadUrl("javascript:androidCallBack()"); } } 一定要放在onPageFinished中,保证webview已经加载完毕,再调用js。 上面通过android调用js的弹窗功能。这也是我们常用的js测试功能。 现在可以说配置完成了,当我们运行上面代码,发现并没有alert数据(或者console数据),这也是困扰我比较长时间的地方。 最后发现,android要获取javascript的弹窗功能(或console)功能,有单独的方法调用。 捕获弹窗(或console) webView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onConsoleMessage(ConsoleMessage cm) { Log.d("test", cm.message() + " -- From line " + cm.lineNumber() + " of " + cm.sourceId() ); return true; } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("alert",message); return true; } }); 加上配置后继续运行。这时发现弹窗的数据的确打印了,不过H5的界面却没显示出来,经过查阅,了解到,webview捕获alert函数后会卡死,需要释放。 修改代码如下: @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("alert",message); //劫持alert以后释放,不然会卡死 result.confirm(); return true; } 再次运行,显示成功。 补充说明下,当时使用fragement加载,需要在切换fragement的时候webview调用js。而fragementmanager的show和hide方法,并不会调用fragement的生命周期函数,经过查阅文档,发现会调用,onHiddenChanged方法,于是问题得到解决。 public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (hidden) {// 不在最前端界面显示 } else {// 重新显示到最前端中 webView.evaluateJavascript("javascript:androidCallBack()",null); }
更多相关文章
- 睡眠唤醒机制简介
- onAttachToWindow() 调用
- Android中文API(138) —— RemoteViews
- Kivy A to Z -- Android(安卓)apk的生成过程
- android 多媒体
- Android调用系统自带的下载程序进行下载。
- 详解 Android(安卓)的 Activity 组件 -
- Android(安卓)面试之 Android(安卓)篇一
- ReactNative调用原生封装的代码和控件