【问题标题】:Displaying Android asset files in a WebView?在 WebView 中显示 Android 资产文件?
【发布时间】:2011-03-16 02:10:51
【问题描述】:

我已经看到各种关于从资产中提供 WebView 页面的问题的讨论,但似乎没有一个是确定的。

我希望能够使用 webview 来显示存储在项目资产中的 html(和包含的 css)文件。

我发现 wv.loadUrl("file:///android_asset/html_no_copy/demo_welcome.html") 可以正常显示该文件,但 demo_welcome.html 中的链接可以是本地的(文件名前没有 url)或绝对的- 与输入到 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 来完成,还是需要编写一些代码来加载数据?

【问题讨论】:

    标签: android webkit


    【解决方案1】:

    好吧,我发现了一些似乎有效的东西(在 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>
    

    【讨论】:

      【解决方案2】:

      代替 loadUrl,尝试使用 loadDataWithBaseURL 方法:

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

      【讨论】:

      • 嗨 Stephane,你传入的 html 对象是什么?第一个参数没有使用吗?
      • +1 这对我有用。第一个参数只是一个假的基本 url。它可以是任何东西。而html 是包含 HTML 代码的字符串。
      • 脏,不回答问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多