कस्टम CSS के साथ एक WebView में HTML का प्रतिपादन


82

मेरा ऐप एक संदेश बोर्ड पृष्ठ का HTML डाउनलोड करने के लिए JSoup का उपयोग कर रहा है (मान लें कि इस मामले में यह किसी दिए गए धागे के पदों वाला पृष्ठ है)। मैं इस एचटीएमएल को लेना चाहता हूं, अवांछित वस्तुओं को बाहर निकालता हूं, और कस्टम सीएसएस को लागू करने के लिए इसे एक वेब व्यू में 'मोबाइल' होने के लिए कहता हूं।

क्या मुझे HTML में शैलियों को इंजेक्ट करना चाहिए क्योंकि मैं इसे संसाधित करता हूं (क्योंकि मैं इसे वैसे भी संसाधित कर रहा हूं) या मेरे ऐप की संपत्ति में सीएसएस फ़ाइल जोड़ने का एक अच्छा तरीका है और बस इसे देखें। मुझे लगता है कि उत्तरार्द्ध आदर्श होगा, लेकिन अनिश्चित कैसे इसके बारे में जाना जाए।

मुझे 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 एसेट डायरेक्टरी से सीएसएस-फाइल्स को खोज और उनका उपयोग कर सकेगा।

ps और, हां, यदि आप अपनी html-file को संपत्ति फ़ोल्डर बनाते हैं, तो आपको आधार यूआरएल निर्दिष्ट करने की आवश्यकता नहीं है।


10
धन्यवाद! मुझे बस यही चाहिए था। (संयोग से, आप इनलाइन HTML की विशेषताओं के लिए दोहरे उद्धरण-चिह्नों के बजाय एकल उद्धरणों का उपयोग कर सकते हैं; इस तरह से आपको उन्हें बैकस्लैश करने की आवश्यकता नहीं होगी। हमेशा मुझे थोड़ा सा अच्छा लगता है ...)
मैट गिब्सन

2
अच्छा लगा। मैं सीधे उत्तर के रूप में PS डालूँगा: यदि आप अपनी HTML फ़ाइल WebView.loadUrl ("फ़ाइल: ///android_asset/fname.html") के साथ लोड करते हैं; आप बस इसके भीतर सापेक्ष url का उपयोग कर सकते हैं।
फोर्टबिस

2
अगर स्टाइलशीट फाइल स्टोरेज में है तो हम लोडडैटविथबेसिउल () का उपयोग कैसे कर सकते हैं? क्या हम 'डेटा / डेटा / आदि /' का उपयोग कर सकते हैं?
यासिर

1
@ यासिर, यह तब भी काम करता है, जब आपकी style.cssफ़ाइल एंड्रॉइड फ़ाइल स्टोरेज में बच जाती है। आपको बस यह सुनिश्चित करने की आवश्यकता है कि baseUrlयह सही है और cssफ़ाइलों के सापेक्ष पथ से मेल खाता है ।
साकिबॉय

2
यदि आपकी फ़ाइलें कच्चे फ़ोल्डर में हैं और संपत्ति में नहीं हैं ( जो आपको Android स्थानीयकरण देता है), तो आधार URL "फ़ाइल: /// 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-page से स्ट्रिंग बनाएं:

    String htmldata = doc.outerHtml();
    
  5. वेबव्यू में वेब-पेज प्रदर्शित करें:

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

अच्छा व्यावहारिक समाधान, यह यूआई (मुख्य) धागे में उपयोग नहीं करने के लिए मत भूलना।
अता इरावानी

मैं एक अन्य मॉड्यूल से style.css एक्सेस करना चाहता हूं। यदि यह असंभव है, तो क्या स्टाइल को स्ट्रिंग के रूप में लोड करने का एक और तरीका है, तो लाइब्रेरी मॉड्यूल क्लास पास करें?
महदी

22

यहाँ समाधान है

अपने HTML / css को अपनी / संपत्ति / फ़ोल्डर में रखें, फिर html फ़ाइल को इस तरह लोड करें:

    WebView wv = new WebView(this);

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

फिर अपने html में आप अपने सीएसएस को सामान्य तरीके से संदर्भित कर सकते हैं

<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

यदि आपके पास आंतरिक फ़ाइल संग्रहण में आपका सीएसएस है तो आप इसका उपयोग कर सकते हैं

//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 मदद करता है!
लेजोनल

1

क्या किसी दिए गए डिव में सभी सामग्री को पृष्ठ में प्रदान करना संभव है? फिर आप आईडी के आधार पर सीएसएस को रीसेट कर सकते हैं, और वहां से काम कर सकते हैं।

कहो तुम अपनी div id = "ocon" दो

आपकी सीएसएस में, एक परिभाषा है:

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

और आप सामग्री पर लागू होने से सभी सीएसएस को साफ करने के लिए मान सेट कर सकते हैं। उसके बाद, आप बस का उपयोग कर सकते हैं

#ocon ul{}

या जो भी हो, सामग्री को नई शैली लागू करने के लिए, स्टाइलशीट को और नीचे करें।


0

आप मौजूदा सामग्री पर स्टाइल सेट करने के लिए ऑनलाइन सीएसएस लिंक का उपयोग कर सकते हैं।

इसके लिए आपको वेबव्यू में डेटा लोड करना होगा और जावास्क्रिप्ट सपोर्ट को सक्षम करना होगा।

नीचे देखें कोड:

   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);

यहां स्टाइल के लिए स्ट्रिंग को जोड़ने के लिए स्ट्रिंगबर्ल का उपयोग करें।

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.