स्ट्रिंग संसाधन में HTML?


120

मुझे पता है कि मैं स्ट्रिंग संसाधनों में बच गए HTML टैग लगा सकता हूं। हालाँकि, संपर्क एप्लिकेशन के स्रोत कोड को देखकर मैं देख सकता हूं कि उनके पास HTML को एन्कोड करने का तरीका नहीं है। संपर्क अनुप्रयोग strings.xml से उद्धरण :

<string name="contactsSyncPlug"><font fgcolor="#ffffffff">Sync your Google contacts!</font> 
\nAfter syncing to your phone, your contacts will be available to you wherever you go.</string>

दुर्भाग्य से, जब मैं कुछ इसी तरह की कोशिश करता हूं (जैसे Hello, <b>World</b>!), getString()टैग के बिना स्ट्रिंग लौटाता हूं (मैं इसे देख सकता हूं logcat)। ऐसा क्यों है? मैं टैग और सब कुछ के साथ मूल स्ट्रिंग कैसे प्राप्त कर सकता हूं? संपर्क एप्लिकेशन यह कैसे कर रहा है?

जवाबों:


199

आप अपने HTML को CDATAब्लॉक में भी घेर सकते हैं और getString()अपने वास्तविक HTML को वापस कर देंगे। जैसे:

<string name="foo"><![CDATA[Foo Bar <a href="foo?id=%s">baz</a> is cool]]></string>

अब जब आप getString(R.string.foo)स्ट्रिंग करेंगे तो HTML होगा। आप एक क्लिक करने योग्य के माध्यम से (लिंक दिखाया गया है) के साथ एचटीएमएल रेंडर करने के लिए की जरूरत है TextViewआप एक प्रदर्शन करने के लिए आवश्यकता होगी Html.fromHtml(...)spannable पाठ प्राप्त करने के लिए कॉल।


1
नहीं, आपको फेलिक्स का जवाब जरूर देखना चाहिए। CDATA आवश्यक नहीं है।
caw

4
@MarcoW। फेलिक्स का जवाब सही है लेकिन सीडीएटी का उपयोग करने से हमें html टैग के बारे में चिंता न करने में मदद मिलती है। यह उत्तर सही उत्तर होना चाहिए।
slhddn

3
यदि आपके पास स्ट्रिंग में लिंक हैं, तो textView.setMovementMethod (LinkMovementMethod.getInstance ()) जोड़ना न भूलें;
आदर्श उर्स

1
मैं का इस्तेमाल किया था \"के लिए styleहालांकि, संपत्ति। उदाहरण<a style=\"...\">link</a>
फैब्रिकियो

1
जब HTML टैग्स के साथ स्ट्रिंग्स स्टाइल करते हैं तो CDATA आपको और अधिक लचीलापन देता है। मैं सहमत हूँ कि 100% जाने का रास्ता है!
Droid क्रिस

89

ऐसा लगता getString()है कि बस - एक तार हो जाता है । इसका उपयोग करने के लिए, आपको getText()(और अधिक नहीं Html.fromHtml()) का उपयोग करना होगा, अर्थात:

mTextView.setText(getText(R.string.my_styled_text));

हालांकि, ऐसा लगता है कि android:textसंपत्ति सिर्फ एक ही काम करती है, और निम्नलिखित बराबर है:

<TextView android:text="@string/my_styled_text" />

और में strings.xml:

<string name="my_styled_text">Hello, <b>World</b>!</string>

28
कृपया ध्यान दें कि केवल समर्थित टैग हैं <b>, <i>, <u>: developer.android.com/guide/topics/resources/…
Snicolas

2
@pawegio निश्चित रूप से आपका मतलब है \n?
फेलिक्स

7
@Snicolas: यह प्रलेखन में वर्णित 3 टैग से अधिक का समर्थन करता है: यह <b>, <i>, <u>, <बड़ा>, <छोटा>, <सुप>, <उप>, <हड़ताल>, का समर्थन करता है <li>, <marquee>, <a>, <font> और <एनोटेशन> (देखें github.com/android/platform_frameworks_base/blob/… )
rve

1
इस पद्धति का उपयोग करते हुए दुर्भाग्य से, स्ट्रिंग में चर की अनुमति नहीं है
एलेसेंड्रो मुज़ी

1
<font> api23 पर समर्थित है, लेकिन एपी 10 नहीं है।
illusionJJ

54

एक तरह से संसाधनों का उपयोग करना सबसे अच्छा समाधान है:

<string name="htmlsource"><![CDATA[<p>Adults are spotted gold and black on the crown, back and wings. Their face and neck are black with a white border; they have a black breast and a dark rump. The legs are black.</p><p>It is similar to two other golden plovers, Eurasian and Pacific. <h1>The American Golden Plover</h1> is smaller, slimmer and relatively longer-legged than Eurasian Golden Plover (<i>Pluvialis apricaria</i>) which also has white axillary (armpit) feathers. It is more similar to Pacific Golden Plover (<i>Pluvialis fulva</i>) with which it was once <b>considered</b> conspecific under the name \"Lesser Golden Plover\". The Pacific Golden Plover is slimmer than the American species, has a shorter primary projection, and longer legs, and is usually yellower on the back.</p><p>These birds forage for food on tundra, fields, beaches and tidal flats, usually by sight. They eat insects and crustaceans, also berries.</p>]]></string>

और इसे प्रदर्शित करने के बजाय:

Spanned sp = Html.fromHtml( getString(R.string.htmlsource));
tv.setText(sp);

बिना <![CDATA[ ]]>और उस संसाधन का उपयोग करने की कोशिश करें tv.setText(getText(R.string.htmlsource));और आपको अंतर दिखाई देगा।


इस जवाब के लिए धन्यवाद, इसने वास्तव में मेरी मदद की
Alsemany

बहुत बड़ी और जटिल HTML फ़ाइल के साथ भी?
सुपहस्टार

क्या यह समर्थन <font> टैग है?
रोहित सिंह

1

मुझे पता है कि यह एक पुराना प्रश्न है लेकिन ऐसा लगता है कि सबसे कुशल उत्तर अभी तक प्रस्तावित नहीं किया गया है।

बस HTML-escapedवर्णों का उपयोग करें ताकि यह संसाधित न हो getStringलेकिन यह HtmlCompact.fromHtml(या पुराने Html.fromHtml) द्वारा संसाधित किया जाएगा ।

यह HTML टैग्स जैसे और टैग का समर्थन करता है, न कि केवल फॉर्मेटिंग की तरह getString

उदाहरण के लिए कुछ इस तरह से काम करना चाहिए:

<string name="html_message">Hello &lt;b>World&lt;/b>.</string>

val text = getString(R.string.html_message)
val result = HtmlCompact.fromHtml(text, HtmlCompat.FROM_HTML_MODE_LEGACY)

आपके मामले में आप इस तरह से प्रतिस्थापित <करते &lt;हैं:

<string name="contactsSyncPlug">&lt;font fgcolor="#ffffffff">Sync your Google contacts!&lt;/font> \nAfter syncing to your phone, your contacts will be available to you wherever you go.</string>

0

यह मेरे लिए बिना CDATA ब्लॉक के काम करता है।

<string name="menu_item_purchase" translatable="false"><font color="red">P</font><font color="orange">r</font><font color="yellow">e</font><font color="green">m</font><font color="white">i</font><font color="blue">u</font><font color="purple">m</font></string>`enter code here`

मैं इसे लेआउट में उपयोग करता हूं।

<item
    android:id="@+id/nav_premium"
    android:icon="@drawable/coins"
    android:title="@string/menu_item_purchase"
    />

-1

आइडिया: HTML को JSON-स्वरूपित फ़ाइलों में रखें और उन्हें / res / कच्चे में संग्रहीत करें। (JSON कम picky है)

किसी सरणी ऑब्जेक्ट में डेटा रिकॉर्ड को इस तरह संग्रहीत करें:

[
    {
        "Field1": "String data",
        "Field2": 12345,
        "Field3": "more Strings",
        "Field4": true
    },
    {
        "Field1": "String data",
        "Field2": 12345,
        "Field3": "more Strings",
        "Field4": true
    },
    {
        "Field1": "String data",
        "Field2": 12345,
        "Field3": "more Strings",
        "Field4": true
    }
]

अपने ऐप में डेटा पढ़ने के लिए:

private ArrayList<Data> getData(String filename) {
    ArrayList<Data> dataArray = new ArrayList<Data>();

    try {
        int id = getResources().getIdentifier(filename, "raw", getPackageName());
        InputStream input = getResources().openRawResource(id);
        int size = input.available();
        byte[] buffer = new byte[size];
        input.read(buffer);
        String text = new String(buffer);

        Gson gson = new Gson();
        Type dataType = new TypeToken<List<Map<String, Object>>>() {}.getType();
        List<Map<String, Object>> natural = gson.fromJson(text, dataType);

        // now cycle through each object and gather the data from each field
        for(Map<String, Object> json : natural) {
            final Data ad = new Data(json.get("Field1"), json.get("Field2"),  json.get("Field3"), json.get("Field4"));
            dataArray.add(ad);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return dataArray;
}

अंत में, Dataवर्ग आसान पहुंच के लिए सार्वजनिक चर का एक कंटेनर है ...

public class Data {

    public String string;
    public Integer number;
    public String somestring;
    public Integer site;
    public boolean logical;


    public Data(String string, Integer number, String somestring, boolean logical)
    {
        this.string = string;
        this.number = number;
        this.somestring = somestring;
        this.logical = logical;
    }
}

यह थोड़ा अधिक इंजीनियर लगता है, इसे html के बजाय json में क्यों नहीं सहेजा जा रहा है?
मिस्सा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.