Android Lollipop WebView不显示<iframe>内容

时间:2015-07-31 16:09:13

标签: javascript android iframe webview

我从服务器收到xhtml代码,我希望在Android应用中显示电子书阅读器。为此,选择了 Monocle 库。

&#xA;&#xA;

接下来,我使用以下代码准备webview:

&#xA;&#xA;
  contentView.addJavascriptInterface(new LectureJSInterface(),“Android”);&#xA; contentView.getSettings()。 setAllowFileAccess(true);&#xA; contentView.getSettings()。setJavaScriptEnabled(true);&#xA; contentView.setBackgroundColor(0xFFECECEC);&#xA; contentView.setWebChromeClient(new WebChromeClient());&#xA; contentView .setWebViewClient(new WebViewClient(){&#xA;&#xA; @Override&#xA; public void onPageFinished(WebView view,String url){&#xA; super.onPageFinished(view,url);&#xA; Global .dismissProgressDialog();&#xA;}&#xA;});&#xA;  
&#xA;&#xA;

之后我从服务器下载xhtml代码并添加使用Monocle的JS代码:

&#xA;&#xA;
  private String prepareCode(String code){&#xA; if((code == null)|| code.equals(“”))return“”;&#xA;&#xA; String newCode = code.substring(code.indexOf(“&lt; html”),code.indexOf(“&lt; head&gt;”)+ 6);&#xA; newCode = newCode.concat(&#xA;“&lt; script src = \”file:///android_asset/monocore.js \“&gt;&lt; / script&gt; \ n”+&#xA;“&lt; link rel = \“stylesheet \”type = \“text / css \”href = \“file:///android_asset/monocore.css \”/&gt; \ n“+&#xA;”&lt; style&gt; \ n“ +&#xA;“#reader {\ n”+&#xA;“width:100%; \ n”+&#xA;“height:100%; \ n”+&#xA;“border:0px solid #000; \ n“+&#xA;”} \ n“+&#xA;”&lt; / style&gt; \ n“+&#xA;”&lt; script&gt; \ n“+&#xA;”\ n“+&#xA;”var isNightMode = false; \ n“+&#xA;”var isFirstLoading = false; \ n“+&#xA;”var startPageNumber = 1; \ n“+&#xA;” \ n“+&#xA;”函数setSettingsForFirstLoading(fontSize,pageNumber,nightMode){\ n“+&#xA;”Android.printLogInfo('setSettingsForFirstLoading()'); \ n“+&#xA;”isFirstLoading = true; \ n“+&#xA;”isNightMode = nightMod e; \ n“+&#xA; “startPageNumber = pageNumber; \ n”+&#xA; “window.changeFontSize(fontSize); \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “function changeFontSize(fontSize){\ n”+&#xA; “Android.printLogInfo('changeFontSize()'); \ n”+&#xA; “window.reader.formatting.setFontScale(fontSize); \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “function nightModeOn(){\ n”+&#xA; “Android.printLogInfo('nightModeOn()'); \ n”+&#xA; “isNightMode = true; \ n”+&#xA; “var i = 0; \ n”+&#xA; “var frame; \ n”+&#xA; “while(frame = window.reader.dom.find('component',i ++)){\ n”+&#xA; “frame.contentDocument.body.style.backgroundColor ='#1F1F1F'; \ n”+&#xA; “frame.contentDocument.body.style.color ='#ECECEC'; \ n”+&#xA; “} \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “function nightModeOff(){\ n”+&#xA; “Android.printLogInfo('nightModeOff()'); \ n”+&#xA; “isNightMode = false; \ n”+&#xA; “var i = 0; \ n”+&#xA; “var frame; \ n”+&#xA; “while(frame = window.reader.dom.find('component',i ++)){\ n”+&#xA; “frame.contentDocument.body.style.backgroundColor ='#ECECEC'; \ n”+&#xA; “frame.contentDocument.body.style.color ='#1F1F1F'; \ n”+&#xA; “} \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “function turnPage(pageNumber){\ n”+&#xA; “Android.printLogInfo('turnPage('+ pageNumber +')'); \ n”+&#xA; “window.reader.moveTo({page:pageNumber}); \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “function savePercents(){\ n”+&#xA; “Android.printLogInfo('savePercents()'); \ n”+&#xA; “Android.savePercents(window.reader.getPlace()。percentAtTopOfPage()); \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “function moveToPercents(percent){\ n”+&#xA; “Android.printLogInfo('moveToPercents('+ percent +')'); \ n”+&#xA; “turnPage(window.reader.getPlace()。pageAtPercentageThrough(percent)); \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “function listenFor(evtName){\ n”+&#xA; “Monocle.Events.listen('reader',evtN​​ame,report); \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “功能报告(evt){\ n”+&#xA; “switch(evt.type){\ n”+&#xA; “case'monocle:loaded':\ n”+&#xA; “Android.calculateSeekBar(window.reader.getPlace()。properties.component.lastPageNumber()); \ n”+&#xA; “休息; \ n”+&#xA; “\ n”+&#xA; “案例'单片眼镜:转':\ n”+&#xA; “Android.updatePagesCounter(window.reader.getPlace()。pageNumber()); \ n”+&#xA; “休息; \ n”+&#xA; “\ n”+&#xA; “案例'单片眼镜:重新计算':\ n”+&#xA; “if(isNightMode)nightModeOn(); \ n”+&#xA; “if(isFirstLoading){isFirstLoading = false; turnPage(startPageNumber);} \ n”+&#xA; “Android.calculateSeekBar(window.reader.getPlace()。properties.component.lastPageNumber()); \ n”+&#xA; “Android.updatePagesCounter(window.reader.getPlace()。pageNumber()); \ n”+&#xA; “休息; \ n”+&#xA; “} \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “function init(){\ n”+&#xA; “var options = {\ n”+ +&#xA; “鳍状肢:Monocle.Flippers.Slider \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “listenFor('monocle:turn'); \ n”+&#xA; “listenFor('monocle:loaded'); \ n”+&#xA; “listenFor('monocle:recalculated'); \ n”+&#xA; “\ n”+&#xA; “window.reader = Monocle.Reader('reader',null,options); \ n”+&#xA; “} \ n”+&#xA; “\ n”+&#xA; “Monocle.Events.listen(window,'load',init); \ n”+&#xA; “&LT; /脚本&GT; \ n”);&#XA; newCode = newCode.concat(code.substring(code.indexOf(“&lt; head&gt;”)+ 6,code.indexOf(“&lt; body&gt;”)+ 6));&#xA; newCode = newCode.concat(“&lt; div id = \”reader \“&gt;”);&#xA; newCode = newCode.concat(code.substring(code.indexOf(“&lt; body&gt;”)+ 6,code.indexOf(“&lt; / body&gt;”)));&#xA; newCode = newCode.concat(“&lt; / div&gt;”);&#xA; newCode = newCode.concat(code.substring(code.indexOf(“&lt; / body&gt;”)));&#xA;返回newCode;&#xA;}&#xA;  
&#xA;&#xA;

完成此任务后,WebView会加载它:

&#xA;&# xA;
  contentView.loadDataWithBaseURL(baseUrl,prepareCode(code),“text / html”,“UTF-8”,null);&#xA;  
&#xA; &#xA;

我的结果是什么?我在Android 4.x和5.x的六台设备上测试了这个应用程序。在Android 4.x上,整个内容都正确显示,但在Android 5.x上我看到一个空白页面。我应该注意到xhtml代码被加载了,因为我可以通过JS接口调用JS函数并获得它的结果。

&#xA;&#xA;

有没有关于修复这个bug的方法的想法?

&#xA;&#xA;

提前致谢!

&#xA;

1 个答案:

答案 0 :(得分:0)

您可以尝试卸载webview系统更新。

尝试单片机2.3.1

https://github.com/joseph/Monocle/issues/259