webview 加载html中如何实现html与手机本地数据的

【Android】WebView中使用EChart 展示本地数据 - 简书
【Android】WebView中使用EChart 展示本地数据
写在开始之前
之前在项目中使用过MPAndroidChart 显示过数据图表,现在需要使用HTML + Echart 来显示,写了一个Demo,DEMO中实现了线图,饼图,还有柱状图。
示例代码地址:
使用到的开源项目
版本:2.2.7
这是一个针对ECharts3.x(2.x)版本的Java类库,实现了所有ECharts中的Json结构对应的Java对象,并且可以很方便的创建Option。这个库引用了Gson,所以build.gradle 中也要加入GSON 的依赖。
版本 2.2.7
JS 和 html 编写
为方便测试,html页面和js代码放置于项目的assets 目录中,Android代码访问路径为:file:///android_asset/jsWeb/echart.html
html 页面编写
在head中引入 js 脚本,主要代码如下:()
&!-- 导入script --&
&script src="http://echarts.baidu.com/echarts2/doc/example/www/js/echarts.js"&&/script&
&script src="./android.js"&&/script&
body中请求需要的EChart脚本,并添加对应控件,主要代码如下: () 。
我在其中添加了一个js中指定数据的EChart 表格用于测试
&div id="main" style="height:400px"&&/div&
&script type="text/javascript"&
// 路径配置
require.config({
echarts: 'http://echarts.baidu.com/echarts2/doc/example/www/js'
//echarts: './www/js'
'echarts',
'echarts/chart/line', // 使用柱状图就加载line模块,按需加载
'echarts/chart/bar', // 使用柱状图就加载bar模块,按需加载
'echarts/chart/pie', // 使用柱状图就加载pie模块,按需加载
function (ec) {
// 基于准备好的dom,初始化echarts图表
var myChart = ec.init(document.getElementById('main'));
//设置数据
var option = {
// .... 数据部分
// 为echarts对象加载数据
myChart.setOption(option);
&b&从Android 代码中获取数据绘制图表&/b&&br/&
&button onClick="loadALineChart()" style="height:40px"&线状图&/button&
&button onClick="loadAChart(2)" style="height:40px"&饼状图&/button&
&button onClick="loadAChart(1)" style="height:40px"&柱状图&/button&
&p id="textcontent"&没有内容&/p&
&div id="chart2" style="height:400px"/&
这里有一点要注意:Android WebView 提供的接口返回String 类型的json option 字符串,而JS 端接受到字符串后需要用JSON.parse 方法转化成js的Object 对象,只有转换成对象之后才可以传入到Echart的setOption 方法中显示出来。
主要代码如下,
function toast(msg){
Android.showToast(msg);
function loadALineChart(){
// 必须加JOSN.parse 转换数据类型
var option = JSON.parse(Android.getLineChartOptions());
var chart2Doc = document.getElementById('chart2');
var myChart2 = require('echarts').init(chart2Doc);
myChart2.setOption(option);
document.getElementById('textcontent').innerHTML=
toast(option);
1 - 饼状图
2 - 柱状图
function loadAChart(type){
// 必须用JSON.parse() 转换一下,才可以显示,否则数据类型会不对
var option = JSON.parse(Android.getPieChartOptions(type));
var chart2Doc = document.getElementById('chart2');
var myChart2 = require('echarts').init(chart2Doc);
myChart2.setOption(option);
document.getElementById('textcontent').innerHTML=
Android 代码编写
1. WebAppInterface 定义和实现
* 注入到JS里的对象接口
class WebAppInterface {
Context mC
public WebAppInterface(Context c) {
mContext =
@JavascriptInterface
public String getLineChartOptions() {
GsonOption option = markLineChartOptions();
LogUtils.d(option.toString());
return option.toString();
@JavascriptInterface
public void showToast(String msg) {
Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
* PieChart 或者柱状图数据示例
* @param type 1 - 饼状图数据; 2 - 柱状图数据
@JavascriptInterface
public String getPieChartOptions(int type) {
mWebView.post(new Runnable() {
public void run() {
showDialog();
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
//地址:http://echarts.baidu.com/doc/example/pie7.html
GsonOption option = new GsonOption();
// 设置标题
option.title(new Title().text("某站点用户访问来源").subtext("纯属虚构").x(X.center));
if(type == 2) {
option.tooltip().trigger(Trigger.item).formatter("{a} &br/&{b} : {c} ({d}%)");
if(type == 1){
option.tooltip().trigger(Trigger.item).formatter("{a} &br/&{b} : {c}");
// 设置图例
option.legend().data("直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎").orient(Orient.vertical).x(X.left);
// 是否可以拖动以计算
option.calculable(true);
if(type == 2){
// 构造数据
pie1 = new Pie("访问来源");
pie1.type(SeriesType.pie).radius("45%").center("50%","60%");
pie1.data(new Data("直接访问",335),
new Data("邮件营销",310),
new Data("联盟广告",234),
new Data("视频广告",135),
new Data("搜索引擎",1548)
option.series(pie1);
if(type ==1) {
// 构建柱状数据
option.xAxis(new CategoryAxis().name("访问来源").data("视频广告","搜索引擎","联盟广告","邮件营销","直接访问"));
option.yAxis(new ValueAxis());
Bar bar = new Bar("访问来源");
bar.data(11,4,14,45,67,88);
option.series(bar);
Log.d("TAG",option.toString());
mWebView.post(new Runnable() {
public void run() {
dismissDialog();
return option.toString();
@JavascriptInterface
public GsonOption markLineChartOptions() {
GsonOption option = new GsonOption();
option.legend("高度(km)与气温(°C)变化关系");
option.toolbox().show(true).feature(Tool.mark, Tool.dataView, new MagicType(Magic.line, Magic.bar), Tool.restore, Tool.saveAsImage);
option.calculable(true);
option.tooltip().trigger(Trigger.axis).formatter("Temperature : &br/&{b}km : {c}°C");
ValueAxis valueAxis = new ValueAxis();
valueAxis.axisLabel().formatter("{value} °C");
option.xAxis(valueAxis);
CategoryAxis categoryAxis = new CategoryAxis();
categoryAxis.axisLine().onZero(false);
categoryAxis.axisLabel().formatter("{value} km");
categoryAxis.boundaryGap(false);
categoryAxis.data(0, 10, 20, 30, 40, 50, 60, 70, 80);
option.yAxis(categoryAxis);
Line line = new Line();
line.smooth(true).name("高度(km)与气温(°C)变化关系").data(15, -50, -56.5, -46.5, -22.1, -2.5, -27.7, -55.7, -76.5).itemStyle().normal().lineStyle().shadowColor("rgba(0,0,0,0.4)");
option.series(line);
2. WebView 上启用JavaScript 并注入Java对象:
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
观乎天文以察时变
观乎人文以化成天下
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
【转】Android 开源项目分类汇总 旭川君已关注
16:49*字数 29527阅读 1795评论 1喜欢 35 来源:https://github.com/Trinea/android-open-project 更多:Android 开源库获取途径...
太长了,还是转载吧...今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫的界面特效设计、个性化控件、工具库、优秀的Android开...
《沉默》 遇见一束灯光飞涌而来 粉碎后被沉默替代 刹那成空白 谁选择过现在 花光时间看别人的情爱 多少人痴傻疯呆 最后被沉默阻碍 不如去疯人院表白 谁还会再勇敢说爱 怕成了安慰的情怀 化作如果 怀疑存在 沉默世界 哪里还有爱 不需要对白 眼神把你出卖 谁的谎言埋葬曾经的爱 ...
第一次来例假那是我上初二的时候,当时害怕的不敢从厕所里出来,幸好是在假期里。,慌乱到不知道如何处理。一个小时两个小时、、、、、、,还是细心的母亲发现了,给我送来折叠整齐的卫生纸(那时候没有现在的卫生巾)害羞又感激,之后母亲给我科普了例假要注意的事情,如何处理,如何折叠卫生纸...
回想自己目前所经历过的人生,其实人类生活的变化还是非常巨大的。仔细想想: 40年前,电还是不普及的,更不用说电灯、电扇、空调、冰箱等; 30年前,交通工具还是非常缺乏的,那时的人们,有个自行车已经是非常奢侈的物件了,当时大部分人们的移动主要靠双脚; 20年前,电脑刚有雏形,...android中WebView和javascript实现数据交互实例
转载 &更新时间:日 10:25:55 & 投稿:junjie
这篇文章主要介绍了android中WebView和javascript实现数据交互实例,需要的朋友可以参考下
在看懂这篇文章之前首先要有javascript基础。
(1) js调用android的方法:
代码如下:WebView wView;
wView. addJavascriptInterface (Object obj, String interfaceName);
是实例化一个对象,在html的js中调用,第二个参数是实例化对象的别名,如果要使用这个obj,则在js中使用的名字
就是interfaceName。
代码如下:public class jsWebDemo extends Activity {&&
&&& WebView wView;
&&& /** Called when the activity is first created. */&
&&& @Override&
&&& public void onCreate(Bundle savedInstanceState) {&&
&&&&&&& super.onCreate(savedInstanceState);&&
&&&&&&& setContentView(R.layout.main);&&&
&&&&&&& wView = (WebView)findViewById(R.id.wv1);&&
&&&&&&&&&&
&&&&&& WebSettings wSet = wView.getSettings();&&
&&&&&&& wSet.setJavaScriptEnabled(true);&
&&&&&&& ProxyBridge pBridge = new ProxyBridge();&&
&&&&&&& wView.addJavascriptInterface(pBridge, "AliansBridge");&&
&&&&&&& wView.loadUrl("file:///android_asset/index.html");&&
&&&&&&&&&&
&private class ProxyBridge {&&
& public int one () {&&
&& return 1;&&
来看一下index.html的内容:
& 代码如下:
& &mce:script language="javascript"&&!--
&&&&&&& /* This function is invoked by the activity */&&
&&&&&&& function wave() {&&
&&&&&&&&&&& alert("1");&&
&&&&&&&&&&& document.getElementById("droid").src="android_waving.png";&&
&&&&&&&&&&& alert("2");&&
&&&&&&& }&&
// --&&/mce:script&
&body&&&&&&
&div id="output"&Test page.&/div&&&&&&
&a onClick="window.demo.clickOnAndroid()"&
&&div style="width:100&&
&&&&&&&&&&& margin:0&&
&&&&&&&&&&& padding:10&&
&&&&&&&&&&& text-align:&&
&&&&&&&&&&& border:2px solid #202020;" &&
&&&&&&&&&&&&&&& &img id="droid" src="android_normal.png" mce_src="android_normal.png"/&&br&&
&&&&&&&&&&&&&&& Click me!&&
&&&&&&& &/div&
&input type="submit" value="change to 1" onclick="document.getElementById('output').innerHTML
=AliansBridge.one()" /&&&&&&
这里的AliansBridge即是调用的JAVA对象。
要注意的是,如果你只有一个方法需要被js调用只new一个对象就行:
ProxyBridge pBridge = new ProxyBridge();
wView.addJavascriptInterface(pBridge, "AliansBridge");
如果你需要调用好多个方法,就要把整个android程序所在的类本身实例化传递进去:
wView.addJavascriptInterface(this, "AliansBridge");
(2) android调用js的方法:wView.setWebChromeClient (WebChromeClient client)
要用到Handler更新UI,Handler mHandler = new Handler();
代码如下:mWebView.setWebChromeClient(new MyWebChromeClient());&&&&&&&&&&&&&&&
&&& mWebView.addJavascriptInterface(new Object(){
&&& /**&&&&&
&&&& * This is not called on the UI thread. Post a runnable to invoke&&&&&
&&&& * loadUrl on the UI thread.&&&&&
&&&& */&&&&&&&
&&& public void clickOnAndroid() {&&&&&&&
&&&&&&& mHandler.post(new Runnable() {&&&&&&&&
&&&&&&&&&&& public void run() {&&&&&&&&
&&&&&&&&&&&&&&& mWebView.loadUrl("javascript:wave()");&&&&&&&&
&&&&&&&&&&& }&&&&&&&&
&&&&&&& });&&&&&&&&&&&&&&&&
&}, "demo");
同理,在html中必须有一个名为demo的对象调用clickOnAndroid()方法。
代码如下:/**&&&&&
&* Provides a hook for calling "alert" from javascript. Useful for&&&&&
&* debugging your javascript.&&&&&
&*/&&&&&&&
final class MyWebChromeClient extends WebChromeClient {&&&&&&&&
&&& @Override&&&&
&&& public boolean onJsAlert(WebView view, String url, String message,&&&&&
&&&&&&&&&&& JsResult result) {&&&&&&&&&&&&&&&&&&&&&
&&&&&&& result.confirm();&&&&&&
&&& return super.onJsAlert(view, url, message, result);&&&&&&&&&&&&&&&&&&&&&&&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
webview可以设置一个WebChromeClient对象,在其onReachedMaxAppCacheSize函数对扩充缓冲做出响应。代码如下:[html]&&其次要修改http服务器中的配置,使其支持text/cache-manifest,我使用的是apache服务器,是windows版本的,在apache的conf文件夹中找到mime.types文件,打开后在文件的最后加上“text/cache-manifest & & & & & & &mf &manifest”,重启服务器即可。这一步很重要,我就是因为服务器端没有配置这个,所以失败了好多次,最后是在附录链接1的回复中找到的线索。经过以上设置Webview就可以支持HTML5的离线应用了。附录链接1中说缓冲目录应该是getApplicationContext().getCacheDir().getAbsolutePath();但我经过试验后发现设置那个目录不起作用,可能是Android版本不同吧,我的是Android4.0.3,而他的可能是以前的Android版本吧。缓冲目录使用getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath()是从附录链接2中找到的线索。
附录链接:
3.HTML5 Offline官方文档:原因:webview加载 服务端的网页,为了减少访问压力,用html5缓存技术,本地建了数据库,在手机浏览器里&&可以显示页面,换成webView就不行了。解决范例:Activity code:代码片段,双击复制0102030405060708091011121314151617181920212223242526public&class&efan_NewsReader&extendsActivity {&&& & &&/** Called when the activity is first created. */&&& & &&@Override&&& & &&publicvoidonCreate(Bundle savedInstanceState)&&& & &&{& &&&& & & & & & &&super.onCreate(savedInstanceState);& &&&& & & & & & &&setContentView(R.layout.main);& && && && &&&& & & & & & &&WebView myWebView=(WebView)findViewById(R.id.my_webview);& &&&& & & & & & &&myWebView.setWebViewClient(newWebViewClient());& &&&& & & & & & &&WebSettings settings = myWebView.getSettings();&&& & & & & & &// 开启javascript设置&&& & & & & & &settings.setJavaScriptEnabled(true);&&&&& & & & & & &// 设置可以使用localStorage&&& & & & & & &settings.setDomStorageEnabled(true);&&& & & & & & &// 应用可以有数据库&&& & & & & & &settings.setDatabaseEnabled(true);& &&&& & & & & & &String dbPath =this.getApplicationContest().getDir("database", Context.MODE_PRIVATE).getPath();&&& & & & & & &settings.setDatabasePath(dbPath);&&& & & & & & &// 应用可以有缓存&&& & & & & & &settings.setAppCacheEnabled(true);& && && && &&&& & & & & & &String appCaceDir =this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();&&& & & & & & &settings.setAppCachePath(appCaceDir);&&& & & & & & &&&&& & & & & & &myWebView.loadUrl("http://10.10.35.47:8080/html5test/test.htm");&&& & &&}}HTML5 page source code:&代码片段,双击复制0102030405060708091011121314151617181920212223242526272829303132333435363738394041&&&&&htmlmanifest="mymanifest.manifest"&&&&&&head&&metahttp-equiv="Content-Type"content="text/ content="no-cache"charset=utf-8" /&&scripttype="text/javascript"src="js/jquery-1.6.1.min.js"&&/script&&&script&$(document).ready(function(){& && &&&&&&databaseTest();});&function databaseTest(){&&&&&&//open database&&&&&var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);&&&&&&& &db.transaction(function (tx) {& && && && &&&&& &tx.executeSql('CREATE TABLE IF NOT EXISTS testHtml (id unique, contentText)');&&&& &tx.executeSql('INSERT INTO testHtml (contentText) VALUES ("insert data test!")');&&&&&& &&});&&&&&&&&db.transaction(function(tx){& && && &&&&&&&&tx.executeSql('SELECT * FROM testHtml',[],function(tx,result){&&&& && && &var len=result.rows.&&&& && && &var msg = "&p&Found rows: " + len + "&/p&";&&&&&& && && &&$("#testinfo").append(msg);&&&& &&&},null);&&&&&});& &&&}&&/script&&&&/head&&body&&&&&&div&here is test info:&/div&&&&&&divid="testinfo"&&/div&&/body&其他设置还有:settings.setCacheMode(WebSettings.LOAD_DEFAULT);& &// 默认使用缓存settings.setAppCacheMaxSize(8*);& &//缓存最多可以有8Msettings.setAllowFileAccess(true);& &// 可以读取文件缓存(manifest生效)in WebChromeClient :代码片段,双击复制01020304050607080910myWebView.setWebChromeClient(newWebChromeClient(){& &&&& & &&@Override& &&&& & &&publicvoidonExceededDatabaseQuota(String url, String databaseIdentifier,&&& & & & & & & & & & &longcurrentQuota,longestimatedSize,longtotalUsedQuota,&&& & & & & & & & & & &WebStorage.QuotaUpdater quotaUpdater)& &&&& & &&{& && &&&&&& & & & & & &&quotaUpdater.updateQuota(estimatedSize *&2);& &&&& & &&}}or:代码片段,双击复制01020304050607080910myWebView.setWebChromeClient(newWebChromeClient(){&&&&// 扩充缓存的容量& &&&& & &&@Override& &&&& & &&publicvoidonReachedMaxAppCacheSize(longspaceNeeded,longtotalUsedQuota,&&& & & & & & & & & & &WebStorage.QuotaUpdater quotaUpdater)& &&&& & &&{& && &&&&&& & & & & & &&quotaUpdater.updateQuota(spaceNeeded *&2);&&&&}}按照范例,我成功的解决了我的问题,而且之前弹出框所出现的找不到数据(提示:underfine)也解决了,这个应该是当初数据库没设所引起的。WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即appcache)。一、网页缓存1、缓存构成/data/data/package_name/cache//data/data/package_name/database/webview.db/data/data/package_name/database/webviewCache.db2、缓存模式较难理解的是以下两个模式:LOAD_DEFAULT,根据cache-control决定是否从网络上取数据。LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。如:m.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。m.sina.com.cn的cache-control为max-age=60,在两种模式下都使用本地缓存数据。总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。3、清除缓存clearCache(boolean)。CacheManager.clear。高版本中需要调用隐藏API。4、控制大小无系统API支持。可选方式:定时统计缓存大小、按时间顺序删除缓存。二、H5缓存1、缓存构成根据setAppCachePath(String appCachePath)提供的路径,在H5使用缓存过程中生成的缓存文件。2、缓存模式无模式选择,通过setAppCacheEnabled(boolean flag)设置是否打开。默认关闭,即,H5的缓存无法使用。3、清除缓存找到调用setAppCachePath(String appCachePath)设置缓存的路径,把它下面的文件全部删除就OK了。4、控制大小通过setAppCacheMaxSize(long appCacheMaxSize)设置缓存最大容量,默认为Max Integer。同时,可能通过覆盖WebChromeClient.onReachedMaxAppCacheSize(long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)来设置缓存超过先前设置的最大容量时的策略。三、参考网址以下地址有关于H5缓存的一些内幕,如每个Application只调用一次WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()被忽略等一系列问题,需要仔细阅读和实验。http://code.google.com/p/android/issues/detail?id=24180
阅读(37459)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Android webView 缓存 Cache + HTML5离线功能 解决',
blogAbstract:'WebView的缓存可以分为页面缓存和数据缓存。&&&&&&&&&& 页面缓存是指加载一个网页时的html、JS、CSS等页面或者资源数据。这些缓存资源是由于浏览器的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地影响到这些缓存数据。&&&&&&&& 他们的索引存放在/data/data/package_name/databases下。他们的文件存放在/data/data/package_name/cache/xxxwebviewcachexxx下。文件夹的名字在2.x和4.x上有所不同,但都文件夹名字中都包含webviewcache。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:5,
permalink:'blog/static/',
commentCount:3,
mainCommentCount:2,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}1、可以是用loadData,这种方法需要先将html文件读取出来,以字符串传入loadData,可以展示页面,但是不会引用css、js等文件。
2、使用loadUrl,不过需要注意,这里因为是使用本地数据,所以传入的url需要做些处理,例如:
  a、如果html文件存于assets:则加前缀:file:///android_asset/
  b、如果html文件存于sdcard:则加前缀:content://com.android.htmlfileprovider/sdcard/
    注意:content前缀可能导致异常,直接使用file:///sdcard/ or file:/sdcard也可以
阅读(...) 评论()

我要回帖

更多关于 wkwebview 加载html 的文章

 

随机推荐