web-dev-qa-db-ja.com

WebViewでAndroidアセットファイルを表示しますか?

アセットからWebViewページを提供する問題に関するさまざまな議論を見てきましたが、どれも決定的なものではありませんでした。

WebViewを使用して、プロジェクトアセットに保存されているhtml(および含まれているcss)ファイルを表示できるようにしたいと思います。

Wv.loadUrl( "file:///Android_asset/html_no_copy/demo_welcome.html")はそのファイルを表示しますが、demo_welcome.htmlのリンクはローカル(ファイル名の前にURLなし)または絶対-同じloadUrlに供給されたフォーム-動作しません。ビューに「Webページが利用できません」というエラーが表示されます。

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だけで実行できるかどうか、またはデータを読み込むためにコードを大量に処理する必要があるかどうかは誰にもわかりますか?

23
Mesocyclone

まあ、私はそれが再帰するという警告にもかかわらず、(1.6と2.2で)動作するように見える何かを見つけました。

また、1番目と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>
28
Mesocyclone

loadUrlの代わりに、loadDataWithBaseURLメソッドを使用してみてください。

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