关于原生+WebView js交互、数据传输问题
原生能接收到webView内控件点击事件,以至拿到点击事件传过来数据
1、定义一个接口
1 2 3 4 | public interface WebHomeOnClickInterface { void showStorePicker(); //显示选择框的事件 void cancelStorePicker(); //选择框消失的事件 } |
2、定义一个类使用该接口
public class JsInterationHome { WebHomeOnClickInterface webOnClickInterface; @JavascriptInterface public void showStorePicker(){ webOnClickInterface.showStorePicker(); } @JavascriptInterface public void cancelStorePicker(){ webOnClickInterface.cancelStorePicker(); } }
3、用到WebView的页面使用
(1)、activity或者fragment继承该接口
implements WebHomeOnClickInterface {
}
(2)、webView控件的初始化
WebSettings settings = webView.getSettings(); settings.setUserAgentString(settings.getUserAgentString().replace("Android", "Android")); settings.setCacheMode(WebSettings.LOAD_DEFAULT); settings.setDomStorageEnabled(true); settings.setDatabaseEnabled(true); settings.setRenderPriority(WebSettings.RenderPriority.HIGH); settings.setUseWideViewPort(false); //将图片调整到适合webview的大小 settings.setLoadWithOverviewMode(true); settings.setSupportZoom(false); // 支持缩放 settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局 settings.setDisplayZoomControls(false); //隐藏webview缩放按钮 settings.setLoadWithOverviewMode(true); settings.setBuiltInZoomControls(false); // 显示放大缩小 controler settings.setDomStorageEnabled(true); settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); settings.setTextZoom(100); settings.setDefaultZoom(WebSettings.ZoomDensity.CLOSE);// 默认缩放模式 settings.setLoadsImagesAutomatically(true); // 重点!!! 重点!!! settings.setJavaScriptEnabled(true); webView.addJavascriptInterface(new JsInterationHome(this), "control");//js 交互
同时设置webView.setWebViewClient();
webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { // 页面加载完成后注册js initJs(view); super.onPageFinished(view, url); } // 其他若干方法隐藏 });
// 具体注解代码
private void initJs(WebView view) { // 判断是否主已经注解js,做过的话不要再次注解js if (!isHasInitJs) { isHasInitJs = true; } else { return; } view.loadUrl("javascript:\n" + "window.addEventListener('route', function(e) {\n" + " control.interceptUrl(e.detail.pathname, e.detail.href);\n" + "})" ); // 监听保存按钮 ,获取返回值 字符串 把对象转字符串 android再解析 view.evaluateJavascript("javascript:window.addEventListener('showStorePicker',function(e){control.showStorePicker()})", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.i("xqxinfo", "showStorePicker"); } } ); view.evaluateJavascript("javascript:window.addEventListener('cancelStorePicker',function(e){control.cancelStorePicker()})", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.i("xqxinfo", "cancelStorePicker"); } } ); }
原生收到web发送的通知后的处理
@Override public void showStorePicker(){ } @Override public void cancelStorePicker() { }
作者:听着music睡
出处:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
Android项目实战
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2019-10-21 集合去重方法,自备