我在资产文件夹中有一个html文件,我想在webview中加载它。我想使用字符串,而不是文件,以便在我想要时替换文件的内容(只保留一个文件并更改我想要显示的内容)。 例如我的html文件是这样的:
<!DOCTYPE html>
<html>
<head>
<title>This is demo</title>
</head>
<body>
<p data-height="265" data-theme-id="0" data-slug-hash="dYPxYp" data-default-tab="html,result" data-user="sckarolos" data-embed-version="2" data-pen-title="SVG Shape Example" class="codepen">
See the Pen <a href="https://codepen.io/sckarolos/pen/dYPxYp/">SVG Shape Example</a>
by sckarolos (<a href="https://codepen.io/sckarolos">@sckarolos</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
</body>
</html>
我有两种方法可以将资产中的html文件作为字符串读取并将其加载到webview中:
private String getHtmlFromAsset() {
InputStream is;
StringBuilder builder = new StringBuilder();
String htmlString = null;
try {
is = getAssets().open(htmlFilename);
if (is != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
htmlString = builder.toString();
}
} catch (IOException e) {
e.printStackTrace();
}
return htmlString;
}
/**
* Loads html page with the content.
*/
private void loadHtmlPage(WebView webView) {
String htmlString = getHtmlFromAsset();
if (htmlString != null) {
webView.loadDataWithBaseURL(null, htmlString, "text/html", "UTF-8", null);
}
else
Toast.makeText(this, "No such page", Toast.LENGTH_LONG).show();
}
在我的活动中,我使用这样的webview:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
AssetManager assetManager = getAssets();
//try to display html content
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
loadHtmlPage(webView);
}
在debuging上我可以看到我的文件读取成功,我的字符串有html文件的内容。但是当我尝试在webview中加载它时,结果一无所获。如果我尝试使用以下方法加载本地html文件:
webView.loadUrl("file:///android_asset/myFile.html");
然后文件加载并成功显示。 我想我的错是使用我从getHtmlFromAsset取回并传入loadHtmlPage的字符串的方式。
任何帮助将不胜感激。
答案 0 :(得分:0)
这里,代码泛需要javascript访问权限,所以当链接加载时你需要提供javascript访问权限。这是工作代码也检查我的模拟器。另外,不要忘记在清单上提供互联网许可。
<强> XML:强>
<WebView
android:id="@+id/wv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<强> JAVA:强>
String str = "<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <title>This is demo</title>\n" +
"</head>\n" +
"<body>\n" +
"\n" +
"<p data-height=\"265\" data-theme-id=\"0\" data-slug-hash=\"dYPxYp\" data-default-tab=\"html,result\" data-user=\"sckarolos\" data-embed-version=\"2\" data-pen-title=\"SVG Shape Example\" class=\"codepen\">\n" +
" See the Pen <a href=\"https://codepen.io/sckarolos/pen/dYPxYp/\">SVG Shape Example</a>\n" +
" by sckarolos (<a href=\"https://codepen.io/sckarolos\">@sckarolos</a>) on <a href=\"https://codepen.io\">CodePen</a>.</p>\n" +
"<script async src=\"https://production-assets.codepen.io/assets/embed/ei.js\"></script>\n" +
"\n" +
"\n" +
"</body>\n" +
"</html>";
WebView wv = findViewById(R.id.wv);
wv.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url){
// do your handling codes here, which url is the requested url
view.getSettings().setJavaScriptEnabled(true);
view.loadUrl(url);
return false; // then it is not handled by default action
}
});
wv.loadData(str, "text/html", "UTF-8");