Візуалізація HTML у WebView із користувацьким CSS


82

Мій додаток використовує JSoup для завантаження HTML сторінки дошки оголошень (припустимо, у цьому випадку це сторінка, що містить публікації певної теми). Я хотів би взяти цей HTML, видалити непотрібні елементи та застосувати користувальницький CSS, щоб оформити його як "мобільний" у WebView.

Чи повинен я вводити стилі в HTML під час його обробки (оскільки я все одно його оброблятиму), чи є хороший спосіб додати CSS-файл до активів мого додатка і просто звернутися до нього. Я думаю, останнє було б ідеальним, але я не знаю, як це зробити.

Я бачу підказки в loadDataWithBaseURL WebView, що ви можете посилатися на локальні ресурси, але не знаєте, як їх використовувати.

Відповіді:


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 замість подвійних лапок; таким чином вам не потрібно буде робити їх зворотні риски. Завжди мені здається трохи акуратніше ...)
Метт Гібсон,

2
Приємно. Я б поставив PS як пряму відповідь: якщо ви завантажуєте свій html-файл із WebView.loadUrl ("файл: ///android_asset/fname.html"); ви можете просто використовувати відносні URL-адреси всередині нього.
fortboise

2
Як ми можемо використовувати loadDataWithBaseURL (), якщо таблиця стилів знаходиться у сховищі файлів? чи можемо ми використовувати 'data / data / etc / "?
Ясір,

1
@Yasir, це працює, навіть якщо ваш style.cssфайл збережено в сховищі файлів для android. Потрібно лише переконатися, що baseUrlвін ідеальний і відповідає cssвідносному шляху до файлів.
Сакібой

2
Якщо ваші файли є вихідною папкою, а не в активах ( що дає вам локалізацію Android), базовою URL-адресою буде "file: /// android_res / raw /"
Себастьян,

35

Я припускаю, що ваша таблиця стилів "style.css" вже знаходиться в папці "активи"

  1. завантажте веб-сторінку jsoup:

    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-сторінки:

    String htmldata = doc.outerHtml();
    
  5. відображення веб-сторінки у веб-перегляді:

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

хороше практичне рішення, не забувайте не використовувати це в потоці інтерфейсу користувача (Main).
Ata Iravani

Я хочу отримати доступ до 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

Радий, що це допомогло @JorgeAmVF!
lejonl

1

Чи можливо весь вміст відображати на сторінці у даному div? Потім ви можете скинути css на основі ідентифікатора та працювати звідти.

Скажімо, ви даєте свій div id = "ocon"

У своєму css вкажіть таке визначення, як:

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

і ви можете встановити значення, щоб очистити всі css від застосування до вмісту. Після цього ви можете просто використовувати

#ocon ul{}

або що завгодно, далі в таблиці стилів, щоб застосувати нові стилі до вмісту.


0

Ви можете використовувати посилання Css Online, щоб встановити стиль для наявного вмісту.

Для цього вам потрібно завантажити дані у веб-перегляді та увімкнути підтримку 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, щоб додати String для стилю.

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());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.