在WebView中显示Android资产文件?

23

我看到了很多讨论关于从资源中提供WebView页面的问题,但都没有一个明确的结论。

我希望能够使用WebView来显示存储在项目资源中的HTML(和包含的CSS)文件。

我发现wv.loadUrl("file:///android_asset/html_no_copy/demo_welcome.html")可以正常显示该文件,但是demo_welcome.html中的链接,无论是本地链接(没有网址前缀的文件名)还是绝对链接 - 与loadUrl传递的形式相同 - 都无法工作。它们在视图上显示“网页不可用”错误。

WebView wv = (WebView)this.findViewById(R.id.splashWebView);
wv.loadUrl("file:///android_asset/html_no_copy/test.html"); // Works
或者
wv.loadUrl("file:///android_asset/html_no_copy/demo_welcome.html"); // Works

但是在demo_welcome.html中,以下链接均无法工作:

<a href="test.html">CLICK HERE</a><p>
<a href="file:///android_asset/html_no_copy/test.html">OR HERE</a>

我知道可以编写内容提供程序来解决这个问题,但那似乎有些过分了。

我希望这可以在SDK 1.6(4)及更高版本上运行。

有人知道是否可以仅使用HTML完成此操作,还是需要编写一些代码来加载数据?

2个回答

28

嗯,我找到了一些看起来似乎可以工作的东西(在1.6和2.2上),尽管有一个警告说它会递归。

我还发现,在没有以下拦截器的情况下,第一页和第二页中都可以使用 css 样式表链接。这很奇怪,让我有点紧张。你有什么想法吗?

这是代码:

WebView wv = (WebView)this.findViewById(R.id.splashWebView);
wv.setWebViewClient(new WebViewClient() {  
  @Override  
  public boolean shouldOverrideUrlLoading(WebView view, String url)  
  {  
    view.loadUrl(url);
    return true;
  }  
}); 
wv.loadUrl("file:///android_asset/html_no_copy/demo_welcome.html");

以下是文件内容:

demo_welcome.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Demo Html</title>
    <link rel="stylesheet" type="text/css" href="demo.css" />
  </head>
  <body>
    <H1>Testing One Two Three</H1>
    <a href="test.html">CLICK HERE</a><p>
    <a href="file:///android_asset/html_no_copy/test.html">OR HERE</a>
  </body>
</html>

test.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <link rel="stylesheet" type="text/css" href="test.css" />
    <title>Insert title here</title>
  </head>
  <body>
    <H1>TEST.HTML</H1>
  </body>
</html>

9

尝试使用loadDataWithBaseURL方法代替loadUrl:

wv.loadDataWithBaseURL("fake://not/needed", html, mimeType, encoding, "");

嗨,Stephane,你传递的HTML对象是什么?第一个参数没有被使用吗? - Robert Karl
+1 这对我有用。第一个参数只是一个虚假的基本URL。它可以是任何东西。而 html 是包含HTML代码的字符串。 - Kayla
4
肮脏且未回答问题。 - Pierre Arlaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接