安卓Android与H5双向交互MathJax展示数学公式(源码+解析)
安卓Android与H5双向交互MathJax展示数学公式(源码+解析)
博主就今天周五又做了个需求(安卓Android与H5交互),原来上线的功能是服务器配置过来的学习报告(一个H5页面)并提供原始的微信分享功能,今天增加的是反向需求,由APP提供给服务器配置过来的H5页面的子级页面调用原生的微信分享,理了一下逻辑(写好给JS调用的方法),然后就是配合前端H5妹子,开启一下午的混合开发测试。(过程省略十万字,读者自行脑补)
文章目录
- 安卓Android与H5双向交互MathJax展示数学公式(源码+解析)
- 一 本文记录安卓原生与H5交互(双向)快速实现
- 二 实现安卓原生调用JS 方法
- 三 实现JS调用原生方法
- 四 Demo下载
- 五 补充
- 六 结尾
备注:本文默认相关知识点,1,webview开发 2,微信SDK接入 3,朋友以及好友圈分享 4,Android与H5交互
安卓原生与H5双向调用完整例子 Demo
我们先上效果gif图,看图再分析
- 图一:原生调用H5 **
需求:数学题型,mathjax原生支持库目前有坑,技术选型实现以原生嵌套H5快速实现做题题型,技术涉及viewpager+h5混合开发
- 图二:H5调用原生(周一补上图二)
需求:H5页面课程,需要分享链接到微信,这就需要我们调用webview时,提供给JS来调用我们的接口,以实现H5调起原生的微信分享功能。
一 本文记录安卓原生与H5交互(双向)快速实现
1,Android与H5交互,首先要实现webview,以及相关配置
调用的本地webview.html文件,需要配置URL
private static final String URL = “file:///android_assetwebview.html”;
//为了防止内存泄漏OOM,博主个人建议不在xml文件中创建WebviewFrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);mWebView = new WebView(getApplicationContext());mWebView.setLayoutParams(layoutParams);mFlWebviewContain.addView(mWebView);mWebSettings = mWebView.getSettings();//支持与JS交互mWebSettings.setJavaScriptEnabled(true);//支持插件//mWebSettings.s//设置自适应屏幕mWebSettings.setUseWideViewPort(true);mWebSettings.setLoadWithOverviewMode(true);//缩放操作mWebSettings.setSupportZoom(true); //支持缩放,默认为true.是下面的那个的前提mWebSettings.setBuiltInZoomControls(true); //设置内置的缩放控件mWebSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件//其他细节操作mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //不缓存,每次都从网络获取
// mWebSettings.setAppCacheEnabled(true);mWebSettings.setAllowFileAccess(true); //设置可以访问文件mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口mWebSettings.setLoadsImagesAutomatically(true); //支持自动加载图片mWebSettings.setDefaultTextEncodingName("utf-8"); //设置编码格式
对应H5 Activity页面XML布局页面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/web_container"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="@color/color_55ceac"><RelativeLayoutandroid:id="@+id/rl_back"android:layout_width="80dp"android:layout_height="match_parent"><ImageViewandroid:id="@+id/iv_back"android:layout_width="40dp"android:layout_height="40dp"android:layout_centerVertical="true"android:layout_marginLeft="5dp"android:paddingLeft="10dp"android:paddingRight="10dp"android:src="@mipmap/retreat"/></RelativeLayout><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textColor="@color/white"android:textSize="16sp"/><!--分享图标--><ImageViewandroid:id="@+id/iv_share"android:layout_width="40dp"android:layout_height="40dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="15dp"android:padding="6dp"android:src="@mipmap/share"/><TextViewandroid:id="@+id/wte"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="15dp"android:textColor="@color/white"android:textSize="12sp"android:visibility="gone"/></RelativeLayout><ImageViewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/login_btn_defalut"/><ProgressBarandroid:id="@+id/web_progress"style="?android:attr/progressBarStyleHorizontal"android:layout_width="match_parent"android:layout_height="6dp"android:max="100"/><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/fl_webview_contain"android:layout_width="match_parent"android:layout_height="match_parent"/><RelativeLayoutandroid:id="@+id/rl_load_error"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:clickable="true"android:visibility="gone"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:orientation="vertical"><ImageViewandroid:layout_width="170dp"android:layout_height="200dp"android:layout_gravity="center_horizontal"android:src="@mipmap/no_load"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="15dp"android:text="网络异常,点击重试"android:textColor="@color/color_5c5c5c"android:textSize="14sp"/></LinearLayout></RelativeLayout></FrameLayout></LinearLayout>
二 实现安卓原生调用JS 方法
核心代码: mWebView.loadUrl(“javascript:htmlCall(” + listarray+ “)”);
//复写shouldOverrideUrlLoading()方法.使得打开网页时不调用系统浏览器,而是在本Webview中显示mWebView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {return false;}//开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {}//在页面加载结束时调用.我们可以关闭loading条,切换程序动作@Overridepublic void onPageFinished(final WebView view, String url) {//访问JS方法mWebView.post(new Runnable() {@Overridepublic void run() {mWebView.loadUrl("javascript:htmlCall(" + contain + ")");}});}}//加载页面出现错误时@Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {//显示加载错误mRlWebviewLoading.setVisibility(View.GONE);mTvWebviewError.setVisibility(View.VISIBLE);}//webView默认是不处理https请求的,页面显示空白,需要进行如下设置@Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {handler.proceed(); //等待证书响应//handler.cancel(); //表示挂起连接,为默认方式//handler.handleMessage(null); //可做其他处理}});
调用的本地webview.html
<!DOCTYPE html>
<html>
<head><title>MathJax TeX Test Page</title><!-- Copyright (c) 2010-2011 Design Science, Inc. --><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax: {inlineMath: [["$","$"],["\\(","\\)"],["\[","\]"] ]},messageStyle: 'none',tex2jax: {preview: 'none'},displayAlign: "left",displayIndent: "2em"});MathJax.Hub.Queue(function () {var height = document.body.offsetHeight;MathJax.Hub.Queue(["Typeset", MathJax.Hub]);window.AndroidWebView.showInfoFromJs(height);});</script><script type="text/javascript" src="../MathJax.js?config=TeX-AMS_HTML-full"></script><style>*{margin:0;padding:0;}.contain{width: 100%;margin: 0 auto;padding-top:10px}.devide{padding-bottom: 20px;}img{max-width:100%;display:block;margin: 0 auto;}p{font-size:.14rem}body{word-wrap:break-word;font-family:Arial;}@media screen and (min-width:360px) and (max-width:414px) {html { font-size: 625%;}}@media screen and (min-width:415px) {html {font-size: 843.75%;}}@media screen and (min-width:320px) and (max-width:360px) {html {font-size: 550%;}}</style></head>
<!--<body style="opacity:0">-->
<body>
<div class="contain" id="sua"><div id="subjects_par" class="devide"><p style = "font-size:.16rem;font-weight:bold">【题目】</p><p id="subjects"></p></div><div id="answers_par" style="display: none" class="devide"><p style = "font-size:.16rem;font-weight:bold">【答案】</p><p id="answers"></p></div><div id="analysis_par" style="display: none" class="devide"><p style = "font-size:.16rem;font-weight:bold">【解析】</p><p id="analysis"></p></div>
</div>
</body><script>
<!-- 调用JS方法,输入数组参数-->var htmlCall = function(array){document.getElementById('subjects').innerHTML=array.subjects;document.getElementById('answers').innerHTML=array.answers;document.getElementById('analysis').innerHTML=array.analysis;if(array.question_finish == 1){document.getElementById('answers_par').style.display = 'block';document.getElementById('analysis_par').style.display = 'block';}}
</script></html>
三 实现JS调用原生方法
核心代码: //在js中调用本地java方法
mWebView.addJavascriptInterface(new JsInterface(mContext), "AndroidWebView");
提供给JS调用类与方法
/*** @ 创建: kx* @ 时间: 2018/8/31* @ 描述: 接口提供给JS 调用原生分享 LoadH5UrlNoRefreshActivity*/public class JsInterface {private Context mContext;public JsInterface(Context context) {this.mContext = context;}/*** 在js中调用window.AndroidWebView.js2ShareWechat(title,text,mWebURl),便会触发此方法。** @param title 分享标题 例子:xx的学习报告* @param text 分享文本内容 例子:xx的学习报告新鲜出炉啦!赶快来围观~~*/@JavascriptInterfacepublic void js2ShareWechat(final String title, final String text, final String webURlL) {//TODO 原生回调微信分享runOnUiThread(new Runnable() {@Overridepublic void run() {showBroadView(title, text, AppConfig.H5HOST + webURlL);}});}/**提供给JS判断前段,Android or ios */@JavascriptInterfacepublic String jsString() {return "Android";}}
四 Demo下载
原生与H5双向调用完整例子 Demo
五 补充
webview返回处理,返回按钮的处理.判断webview能否canGoBack(),有则mWebView.goBack(),没有则原生的 finish();
if (mWebView.canGoBack()) {mWebView.goBack(); //goBack()表示返回WebView的上一页面} else {finish();}
六 结尾
一周的充实又紧凑的开发过后,在恬谧地周末得以放松并总结,写下此文,实乃高兴如有问题bug或者写的不当之处,请联系博主,请读者不吝赐教,博主感激不尽(博主邮箱593584960@qq.com)
安卓Android与H5双向交互MathJax展示数学公式(源码+解析)相关推荐
- EasyPusher实现安卓Android手机直播推送同步录像功能(源码解析)
EasyPusher是一款非常棒的推送客户端.稳定.高效.低延迟,音视频同步等都特别好.装在安卓上可作为一款单兵设备来用.说到单兵,在项目中通常都需要边传边录的功能,因此后来EasyPusher也加入 ...
- C51单片机与PCF8591模块的交互:C语言源码解析
目录 1. PCF8591模块简介 2. C51单片机与PCF8591的连接 3. C51单片机与PCF8591的C语言源码解析 4. 用法示例 5. 总结 6. 参考文献 在微控制器的世界中,C51 ...
- Android特别的数据结构(二)ArrayMap源码解析
1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成,一个int[] mHashes用来存放 ...
- Android特别的数据结构(一) SparseArray源码解析
1.数据结构 class SparseArray<E> implements Cloneable 由两个数组构成,一个数组mKeys类型为int[],存放Key,一个数组mValues类型 ...
- yolov3安卓实现_YOLOv3 的 TensorFlow 实现,GitHub 完整源码解析
来自华盛顿大学的 Joseph Redmon 和 Ali Farhadi 提出的YOLOv3 通过在 YOLO 中加入设计细节的变化,这个新模型在取得相当准确率的情况下实现了检测速度的很大提升,一般它 ...
- 安卓开发者必看:Android的数据结构与算法——ArrayList源码解析
作者:JerryloveEmily 原文链接:https://www.jianshu.com/p/159426e2aaf6 文章有点长,比较啰嗦,请耐心看完! 一.概述 首先得明白ArrayList在 ...
- Android图片爬虫,看妹纸神器项目源码,ListView单张图片查看
Android图片爬虫,看妹纸神器项目源码 刚自学完安卓,国庆7七天花了6天纯手写入门级app,从集成图片爬虫到整个项目结束真是一步一个坑. 整个项目没有用框架,都是手写纯属练手,项目中主要用到的技术 ...
- 【Android项目】本地FM收音机开发及源码简析
[Android项目]本地FM收音机开发及源码简析 目录 1.概述 2.收音机的基本原理 3.收音机其他信息 RDS功能 4.Android开发FM收音机源码解析 5.App层如何设计本地FM应用 6 ...
- 【源码篇】安卓源码解析(持续总结)
前言 在Linux中,一切皆为文件.安卓底层也是基于Linux开发的. 在我们了解源码目录的时候,我们要先知道这些源码的后缀名代表的是什么文件,什么意思,才能更好的去了解其中的原理. 文章目录 前言 ...
最新文章
- 弹出框的鼠标拖拽事件
- randn函数加噪声_NLP入门指南01:感知机、激活函数、损失函数
- C#sql语句如何使用占位符
- 第48讲:分布式利器 Scrapy-Redis 原理
- 最短路--DijkstraFloyedSPFA
- kubernetes ui 搭建
- python找不到自带的argparse_python argparse用法总结
- lwip-1.4.1文档sys_arch翻译
- java spring 多数据源_Spring多数据源解决方案
- Python 抓取网页乱码问题 以及EXCEL乱码
- 我的世界启动器java_我的世界最新启动器 无需安装JAVA
- c语言实现输入电压检测,STC12C2052AD单片机AD转换C语言程序的实现
- Java多线程系列--“JUC线程池”03之 线程池原理(二)
- C语言————有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,下面的程序统计卖完西瓜所需的天数
- R语言柯西概率分布(cauchy distribution)函数(dcauchy, pcauchy, qcauchy rcauchy)实战
- Prometheus普罗米修斯调研笔记
- uniapp云开发微信小程序 云函数配置
- 广告拦截软件测试简历,ADSafe广告拦截效果测试
- 记一次对易班前端解密的经过
- 主机名以及内外部命令
热门文章
- echart vue
- UE 某图局部 展UV 图标 / CSS 精灵图(sprite) 好像
- [GXYCTF2019]Ping Ping Ping 1解题思路
- Preserving Semantic Neighborhoods for RobustCross-modal Retrieval
- Excel打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”最快的解决办法
- PPT幻灯片演示模式设置
- 使用AcronisTrueImage 2020迁移thinkpad x1 carbon 2016(4th gen) win10系统到1t的固态硬盘970evoPlus的过程
- 创建一个IntelliJ Idea文件模板,将光标放在文件中的特定位置
- Pro Android学习笔记(一五五):传感器(5): 磁场传感器和方位(上)
- java实现word文件转图片,支持分页