カスタムCSSを使用したWebViewでのHTMLのレンダリング


82

私のアプリはJSoupを使用してメッセージボードページのHTMLをダウンロードしています(この場合、特定のスレッドの投稿を含むページであるとしましょう)。このHTMLを取得し、不要なアイテムを取り除き、カスタムCSSを適用して、WebViewで「モバイル」になるようにスタイルを設定したいと思います。

処理中にスタイルをHTMLに挿入する必要がありますか(とにかく処理するため)、CSSファイルをアプリのアセットに追加して単に参照する良い方法がありますか?後者が理想的だと思いますが、どうすればよいかわかりません。

WebViewのloadDataWithBaseURLに、ローカルアセットを参照できるというヒントがありますが、その使用方法がわかりません。

回答:


129

WebView.loadDataWithBaseURLを使用できます

htmlData = "<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\" />" + htmlData;
// lets assume we have /assets/style.css file
webView.loadDataWithBaseURL("file:///android_asset/", htmlData, "text/html", "UTF-8", null);

その後、WebViewはアセットディレクトリからcssファイルを見つけて使用できるようになります。

psそして、はい、アセットフォルダからhtmlファイルをロードする場合、ベースURLを指定する必要はありません。


10
ありがとう!それが私が必要としていたものでした。(ちなみに、インラインHTMLの属性には、二重引用符の代わりに一重引用符を使用できます。そうすれば、それらをバックスラッシュする必要はありません。常に少しきれいに見えます...)
Matt Gibson

2
いいね。私はPSを直接の答えとして置きます:WebView.loadUrl( "file:///android_asset/fname.html");でhtmlファイルをロードする場合。その中で相対URLを使用するだけです。
fortboise 2014年

2
スタイルシートがファイルストレージにある場合、loadDataWithBaseURL()をどのように使用できますか?'data / data / etc / "を使用できますか?
Yasir 2014年

1
@Yasir、style.cssファイルがAndroidファイルストレージに保存されている場合でも機能します。それbaseUrlが完璧で、cssファイルの相対パスと一致していることを確認する必要があります。
サキボーイ2016

2
ファイルがrawフォルダーであり、アセットにない場合(Androidのローカリゼーション提供します)、ベースURLは「file:/// android_res / raw /」になります
Sebastian

35

あなたのスタイルシート「style.css」はすでにassets-folderにあると思います

  1. jsoupを使用してWebページをロードします。

    doc = Jsoup.connect("http://....").get();
    
  2. 外部スタイルシートへのリンクを削除します。

    // remove links to external style-sheets
    doc.head().getElementsByTag("link").remove();
    
  3. ローカルスタイルシートへのリンクを設定します。

    // set link to local stylesheet
    // <link rel="stylesheet" type="text/css" href="style.css" />
    doc.head().appendElement("link").attr("rel", "stylesheet").attr("type", "text/css").attr("href", "style.css");
    
  4. jsoup-doc / web-pageから文字列を作成します。

    String htmldata = doc.outerHtml();
    
  5. WebビューでWebページを表示する:

    WebView webview = new WebView(this);
    setContentView(webview);
    webview.loadDataWithBaseURL("file:///android_asset/.", htmlData, "text/html", "UTF-8", null);
    

実用的な解決策です。UI(メイン)スレッドで使用しないことを忘れないでください。
Ata Iravani 2017

別のモジュールからstyle.cssにアクセスしたい。これが不可能な場合、スタイルを文字列としてロードしてからライブラリモジュールクラスに渡す別の方法はありますか?
マハディ

22

これが解決策です

htmlとcssを/ assets /フォルダーに置き、次のようにhtmlファイルをロードします。

    WebView wv = new WebView(this);

    wv.loadUrl("file:///android_asset/yourHtml.html");

次に、HTMLで通常の方法でCSSを参照できます

<link rel="stylesheet" type="text/css" href="main.css" />

9

それは次のように簡単です:

WebView webview = (WebView) findViewById(R.id.webview);
webview.loadUrl("file:///android_asset/some.html");

そして、some.htmlには次のようなものが含まれている必要があります。

<link rel="stylesheet" type="text/css" href="style.css" />

2

内部ファイルストレージにCSSがある場合は、次を使用できます。

//Get a reference to your webview
WebView web = (WebView)findViewById(R.id.webby);

// Prepare some html, it is formated with css loaded from the file style.css
String webContent = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><link rel=\"stylesheet\" href=\"style.css\"></head>"
                      + "<body><div class=\"running\">I am a text rendered with INDIGO</div></body></html>";

//get and format the path pointing to the internal storage
String internalFilePath = "file://" + getFilesDir().getAbsolutePath() + "/";

//load the html with the baseURL, all files relative to the baseURL will be found 
web.loadDataWithBaseURL(internalFilePath, webContent, "text/html", "UTF-8", "");

ここの例でwebContent、問題を解決することができました。ありがとう!
JorgeAmVF 2018年

@JorgeAmVFに役立ってよかったです!
lejonl 2018年

1

特定のdivで、すべてのコンテンツをページ内にレンダリングすることは可能ですか?次に、IDに基づいてCSSをリセットし、そこから作業することができます。

div id = "ocon"を指定するとします

あなたのcssで、次のような定義を持っています:

#ocon *{background:none;padding:0;etc,etc,}

また、値を設定して、すべてのcssがコンテンツに適用されないようにすることができます。その後、あなたはただ使うことができます

#ocon ul{}

または、スタイルシートのさらに下にあるものを使用して、コンテンツに新しいスタイルを適用します。


0

オンラインCssリンクを使用して、既存のコンテンツにスタイルを設定できます。

そのためには、webviewにデータをロードし、JavaScriptサポートを有効にする必要があります。

以下のコードを参照してください。

   WebSettings webSettings=web_desc.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDefaultTextEncodingName("utf-8");
    webSettings.setTextZoom(55);
    StringBuilder sb = new StringBuilder();
    sb.append("<HTML><HEAD><LINK href=\" http://yourStyleshitDomain.com/css/mbl-view-content.css\" type=\"text/css\" rel=\"stylesheet\"/></HEAD><body>");
    sb.append(currentHomeContent.getDescription());
    sb.append("</body></HTML>");
    currentWebView.loadDataWithBaseURL("file:///android_asset/", sb.toString(), "text/html", "utf-8", null);

ここでは、StringBuilderを使用して、スタイルの文字列を追加します。

sb.append("<HTML><HEAD><LINK href=\" http://yourStyleshitDomain.com/css/mbl-view-content.css\" type=\"text/css\" rel=\"stylesheet\"/></HEAD><body>");
sb.append(currentHomeContent.getDescription());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.