Android与H5界面的交互(参数互传)以及遇到的一些问题
来源:互联网 发布:seo免费学习网 编辑:程序博客网 时间:2024/06/06 00:22
前言
在开发项目时,有部分界面是H5界面,原本以为直接加载H5界面就能搞定,后来还是遇到参数互传问题了,然后网上意见不一,只好自己摸索,下面就给大家聊聊我遇到的问题~~~
1.先给大家看看成功之后的界面跳转:
解释一下:
界面跳转流程: 首页的限时特卖–>限时特卖的H5界面–>商品详情页.
(1)由App原生界面跳转
由首页的限时特卖进入显示特卖的H5界面:直接将后台返回的H5链接加载到WebView界面,对大家来说肯定没有丝毫难度吧,在这里就不粘代码了
(2)从H5的商品列表页进入到商品详情页时需要商品的id,这就真正的涉及到与H5的交互了,看代码:
public class MyGoods { Context context; public MyGoods(Context context) { this.context = context; } //该方法将暴露给js调用,打来商品详情页 @JavascriptInterface public void getCall(String goodsid) { Intent intent = new Intent(context, GoodsDetailsAct.class); intent.putExtra("goods_id", goodsid); context.startActivity(intent); }}
定义一个全局的类,在这个类里面只需要写一个Intent,打开商品详情页,并将id传过去;MyGoods中的方法使用@JavascriptInterface修饰,因此会将这两个方法暴露给JS脚本,则允许JS脚本通过MyGood来调用MyGoods里面的方法:
然后我自己封装了一个关于公共的加载WebView的类:
初始化完成之后作如下操作:
WVJBWebView.getSettings().setJavaScriptEnabled(true);WVJBWebView.addJavascriptInterface(new MyGoods(PublicWebViewAct.this), "MyGood");
第一行代码开启了JS调用Android方法的功能;第二行则负责将Android应用中的MyGoods对象暴露给JS脚本;
前端的同学在他的代码里只写了一下这行代码:
MyGood.getCall(goods_id);
最后就大功告成了,点击的条目的Id就传过来了~~~
2.在与H5交互过程中遇到其他的问题
(1) 我们H5界面比较多,然后我们的界面的标题栏用的都是原生的,然后前端同学就把自己H5界面的标题栏给干掉了,之后就需要获取标题,然后就在网上找到了这个方法:
每次加载新的界面就能获取到该H5界面的标题,当然了,这也离不开H5同学的配合哦~~
(2) 关于H5界面在Android5.0 以上系统加载报错的问题:
if (android.os.Build.VERSION.SDK_INT >= 21) { WVJBWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }
在加载数据之前做个判断就行了,设置上面的属性就没问题了;
(3) 在一个比较复杂的H5界面需要调用系统的相册和摄像头,在调用时 APP崩溃:
WVJBWebView.setWebChromeClient(new WebChromeClient() { // For Android < 3.0 public void openFileChooser(ValueCallback<Uri> valueCallback) { uploadMessage = valueCallback; openImageChooserActivity(); } // For Android >= 3.0 public void openFileChooser(ValueCallback valueCallback, String acceptType) { uploadMessage = valueCallback; openImageChooserActivity(); } //For Android >= 4.1 public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) { uploadMessage = valueCallback; openImageChooserActivity(); } // For Android >= 5.0 @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { uploadMessageAboveL = filePathCallback; openImageChooserActivity(); return true; } });
打开图库的方法:
private void openImageChooserActivity() { Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i,"ImageChooser"),FILE_CHOOSER_RESULT_CODE); }@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == FILE_CHOOSER_RESULT_CODE) { if (null == uploadMessage && null == uploadMessageAboveL) return; Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); if (uploadMessageAboveL != null) { onActivityResultAboveL(requestCode, resultCode, data); } else if (uploadMessage != null) { uploadMessage.onReceiveValue(result); uploadMessage = null; } } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) { if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null) return; Uri[] results = null; if (resultCode == Activity.RESULT_OK) { if (intent != null) { String dataString = intent.getDataString(); ClipData clipData = intent.getClipData(); if (clipData != null) { results = new Uri[clipData.getItemCount()]; for (int i = 0; i < clipData.getItemCount(); i++) { ClipData.Item item = clipData.getItemAt(i); results[i] = item.getUri(); } } if (dataString != null) results = new Uri[]{Uri.parse(dataString)}; } } uploadMessageAboveL.onReceiveValue(results); uploadMessageAboveL = null; }
在加载WebView时遇到的主要问题就是这些了,只是给大家单纯的做一个实用的代码总结,做到上手能用就行,想了解更多底层原理的同学需要自己努力了哦~~我只是个小菜鸟
需要我那个公共的WebView的同学可以私信或者加我QQ哦,祝大家工作顺利~~~
- Android与H5界面的交互(参数互传)以及遇到的一些问题
- Android与H5的交互问题
- android webview与h5交互时所遇到的坑
- Android与H5的交互
- Android与H5的交互
- Android与H5的交互
- Android与H5的交互
- android与H5的交互
- 学习H5页面遇到的一些问题与解决办法汇总
- Android和H5的交互问题
- H5与android原生的JS交互
- Android原生与H5交互的实现
- Android 与H5交互的小Demo
- Android原生与H5交互的实现
- Android原生与H5交互的实现
- android与h5的互相交互传参
- iOS与H5交互 以及问题记录
- h5遇到的问题
- 02-线性结构3 Reversing Linked List (25分)
- AWS Account
- 解决Hash冲突的几种方法
- CentOS 7下安装Redmine中文版图文教程
- 使用JobControl管理mapreduce多job依赖
- Android与H5界面的交互(参数互传)以及遇到的一些问题
- ES6数组扩展
- Swift3的Dictionary和OC的NSDictionary关系
- 如何查看linux内核版本
- 正则表达式
- 如何获取服务器当前时间
- 【百度春招】度度熊回家
- Easy-43
- sui mobile h5框架地址