XML में html-स्वरूपित स्ट्रिंग संसाधन से TextView पाठ सेट करें


195

मेरे अंदर कुछ निश्चित तार हैं strings.xml, जैसे कुछ:

<resources>
    <string name="somestring">
        <B>Title</B><BR/>
        Content
    </string>
</resources>

और मेरे लेआउट में मुझे एक ऐसा फॉर्मूला मिला है, TextViewजिसे मैं html- स्वरूपित स्ट्रिंग के साथ भरना चाहता हूं।

<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>

अगर मैं ऐसा करता हूं, की सामग्री किसी भी HTML टैग formattedtextसे somestringछीनने की सामग्री है और इस तरह से अनफ़ार्टेड है।

मुझे पता है कि प्रोग्राम के साथ स्वरूपित पाठ को सेट करना संभव है

.setText(Html.fromHtml(somestring));

क्योंकि मैं अपने कार्यक्रम के अन्य हिस्सों में इसका उपयोग करता हूं जहां यह उम्मीद के मुताबिक काम कर रहा है।

इस फ़ंक्शन को कॉल करने के लिए मुझे एक की आवश्यकता है Activity, लेकिन इस समय मेरा लेआउट सादे XML में बस एक सरल या कम स्थिर दृश्य है और मैं इसे इस तरह से छोड़ने के लिए पसंद करूंगा, मुझे Activityकुछ सेट करने के लिए बस बनाने के ओवरहेड से बचाने के लिए। पाठ।

क्या मैं कुछ स्पष्ट देख रहा हूँ? क्या यह बिल्कुल भी संभव नहीं है? किसी भी मदद या समाधान का स्वागत करते हैं!

संपादित करें: बस कुछ चीजों की कोशिश की और ऐसा लगता है कि xml में HTML प्रारूपण में कुछ प्रतिबंध हैं:

  • टैग को लोअरकेस लिखा जाना चाहिए

  • कुछ टैग जो यहां बताए गए हैं वे काम नहीं करते हैं, उदाहरण के लिए <br/>(इसके \nबजाय इसका उपयोग करना संभव है )


1
लंबे समय से अब मुझे पता है, लेकिन मैं एक टेक्स्ट दृश्य के लिए HTML का उपयोग करके एक नई लाइन के लिए <br> और n का उपयोग करने में सक्षम था।
तम

2
क्या यह सिर्फ xml से काम कर सकता है? मेरे पास उत्तर पर एक छोटा सा इनाम है। मैं इस बिंदु पर एक तथ्यात्मक जवाब के रूप में नहीं ले सकता, मैं पहले से ही इसके चारों ओर कोडित हूं।
danny117

1
मुझे यह दिलचस्प लगता है कि किसी ने वास्तव में सवाल का जवाब नहीं दिया। ओपी कहता है कि वह जानता है कि इसे एचटीएमएल () से कैसे करना है, लेकिन इसे सीधे लेआउट फ़ाइल में करना चाहते हैं (हालांकि, कारण अच्छे नहीं हैं ... आपके पास हमेशा एक गतिविधि / संदर्भ उपलब्ध है यदि आप ड्राइंग कर रहे हैं स्क्रीन)। जवाबों में से कोई भी लंगर टैग के प्रभावों में गोता नहीं लगाता है।
लिलबर्डी

जवाबों:


481

बस अगर किसी को यह पता चलता है, तो एक अच्छा विकल्प है जिसे प्रलेखित नहीं किया गया है (मैं घंटों तक खोज करने के बाद इस पर फंस गया, और अंत में इसे एंड्रॉइड एसडीके के लिए बग सूची में पाया गया)। आप कर सकते हैं strings.xml में कच्चे एचटीएमएल, जब तक आप में लपेट के रूप में के रूप में शामिल

<![CDATA[ ...raw html... ]]>

उदाहरण:

<string name="nice_html">
<![CDATA[
<p>This is a html-formatted string with <b>bold</b> and <i>italic</i> text</p>
<p>This is another paragraph of the same string.</p>
]]>
</string>

फिर, अपने कोड में:

TextView foo = (TextView)findViewById(R.id.foo);
foo.setText(Html.fromHtml(getString(R.string.nice_html)));

IMHO, यह परिमाण के कई आदेशों के साथ काम करने के लिए अच्छा है :-)


26
बस जोड़ने के लिए, आप सीडीएटीए ब्लॉक के अंदर एपॉस्ट्रॉफ़-एस्केप एपॉस्ट्रॉफ़ / सिंगल-कोट्स को भी बैक कर सकते हैं, ताकि आपके पास असीम-कुरूपता के बजाय <b> कैन \ _ टी </ b> जैसी चीजें हो सकती हैं; / b>
बिटबंग

5
क्या यह अभी भी काम करता है? मैंने अभी इसकी कोशिश की और यह सचमुच <p> और </ p> प्रदर्शित करता है।
पेरी हार्टमैन

1
@PeriHartman क्या आपने भी कुछ किया Html.fromHtml(getString(R.string.nice_html))? :)
async

1
TextView foo = (TextView) कहां से पता चलता है ViewById (R.id.foo); foo.setText (Html.fromHtml (GetString (R.string.nice_html))); जाने की जरूरत?
RustyIngles

2
क्या "Html.fromHtml" से बचने का कोई तरीका है?
एंड्रॉयड डेवलपर

127

जैसा कि शीर्ष उत्तर कुछ गलत (या कम से कम जटिल) का सुझाव दे रहा है, मुझे लगता है कि इसे अपडेट किया जाना चाहिए, हालांकि यह सवाल काफी महत्वपूर्ण है:

एंड्रॉइड में स्ट्रिंग संसाधनों का उपयोग करते समय, आपको बस getString(...)जावा कोड से कॉल करना होगा या android:text="@string/..."अपने लेआउट एक्सएमएल में उपयोग करना होगा ।

यदि आप अपने स्ट्रिंग्स में HTML मार्कअप का उपयोग करना चाहते हैं, तो भी आपको बहुत कुछ बदलने की आवश्यकता नहीं है:

आपके स्ट्रिंग संसाधनों में भागने के लिए केवल वही पात्र हैं:

  • दोहरा उद्धरण चिह्न: "बन जाता है\"
  • एकल उद्धरण चिह्न: 'बन जाता है\'
  • एम्परसेंड: &बन जाता है &#38;या&amp;

इसका मतलब है कि आप टैग से बचकर अपना HTML मार्कअप जोड़ सकते हैं :

<string name="my_string"><b>Hello World!</b> This is an example.</string>

हालांकि, सुनिश्चित करने के लिए, आपको केवल उपयोग करना चाहिए <b>, <i>और <u>जैसा कि वे प्रलेखन में सूचीबद्ध हैं।

यदि आप XML से अपने HTML स्ट्रिंग्स का उपयोग करना चाहते हैं , तो बस उपयोग करते रहें android:text="@string/...", यह ठीक काम करेगा।

अंतर केवल इतना है कि, यदि आप जावा कोड से अपने HTML स्ट्रिंग्स का उपयोग करना चाहते हैं, तो आपको अब के getText(...)बजाय उपयोग करना होगा getString(...), क्योंकि पूर्व शैली रखता है और बाद वाला इसे बंद कर देगा।

यह उतना ही आसान है। कोई सीडीएटीए, नहीं Html.fromHtml(...)

आपको केवल तभी आवश्यकता होगी Html.fromHtml(...)जब आपने HTML मार्कअप में अपने विशेष वर्णों को एनकोड किया हो । इसके getString(...)बाद इसका इस्तेमाल करें । यदि आप स्ट्रिंग को पास करना चाहते हैं तो यह आवश्यक हो सकता है String.format(...)

यह सब डॉक्स में भी वर्णित है

संपादित करें:

getText(...)Unescaped HTML (जैसा कि मैंने प्रस्तावित किया है) या CDATAवर्गों और के बीच कोई अंतर नहीं है Html.fromHtml(...)

तुलना के लिए निम्नलिखित ग्राफिक देखें:

यहां छवि विवरण दर्ज करें


मेरा यह छीन रहा है। मैं निम्नलिखित कोड का उपयोग कर रहा हूँ:getResources().getText(R.string.codename)
Si8

3
बेहतर मदद करने के लिए, मुझे जावा / एक्सएमएल अंश देखने होंगे। लेकिन जैसा कि मैंने लिखा है: आप केवल यकीन है कि अगर आप उपयोग कर रहे हैं <b>, <i>, <u>। अन्य टैग हमेशा समर्थित नहीं होते हैं।
caw

1
आपका जवाब काम करता है और सरल है। बस वांछित एचटीएमएल टैग के साथ अपनी स्ट्रिंग को स्ट्रिंग्स.एक्सएमएल में रखें, और इसे अपने लेआउट xml फ़ाइल से संदर्भित करें। मैंने <सुप> टैग का उपयोग किया।
पेरी हार्टमैन

1
तुम्हारा दूसरा समाधान है, दूसरे के लिए कोई विकल्प नहीं है क्योंकि यह अन्य टैग की तरह सभी टैग का समर्थन नहीं करता है। मैं इस समाधान में कोई फायदा नहीं देख सकता जब दूसरा बहुत सरल हो।
मोबाइलपॉटो 7

1
जैसा कि मैंने अनुभव किया कि "सीडीएटीए" का उपयोग करने में समस्या है, उदाहरण के लिए कुछ इस तरह: <! [सीडीएटीए [... एचटीएमएल ...]]> जिसमें 22 अक्षर हैं और एचटीएमएल भाग में 10. हैं। यदि आप HTML.fromhtml (का उपयोग करते हैं) getstring (...) आपके पाठ को सही ढंग से दिखाएगा लेकिन पाठ की सामग्री को 22 अक्षरों के रिक्त स्थान की आवश्यकता है। मैंने लिस्टव्यू में इस्तेमाल किया और वीडी स्पेस देखा। तो gettext () बेहतर है।
डेविड

16

अपने HTML टैग से बचिए ...

<resources>
    <string name="somestring">
        &lt;B&gt;Title&lt;/B&gt;&lt;BR/&gt;
        Content
    </string>
</resources>

डॉक्स का यही कहना है: developer.android.com/intl/zh-TW/guide/topics/resources/… लेकिन क्या TextViewHTML दिखाने के लिए यह पर्याप्त है ?
मकारसे

3
मैंने इसका परीक्षण किया है, और यदि आप इसे जावा स्रोत कोड से उपयोग करते हैं, तो यह ठीक है। लेकिन अगर आप अपने पाठ को सीधे लेआउट XML से
जोड़ते

किसी दृश्य में पाठ दिखाने के लिए , विशेष रूप से वर्ग [ developer.android.com/reference/android/text/Html.html] का उपयोग करें fromHTML()
इकावास

@ZoltanF एंड्रॉइड का उपयोग करके सही है: HTML के साथ लेआउट से टेक्स्ट = "" स्ट्रिंग में टैग दिखाएगा।
एंड्रयू मैकेंजी

1
यदि आप XML से सीधे HTML स्ट्रिंग का उपयोग करना चाहते हैं, तो आप स्ट्रिंग में HTML विशेष वर्णों को एनकोड नहीं कर सकते । हालांकि, अगर आप कोड से स्ट्रिंग उपयोग करना चाहते हैं के माध्यम से Html.fromHTML()आप के लिए है विशेष वर्ण सांकेतिक शब्दों में बदलना। अजीब!
कांव-कांव

11

एंड्रॉइड के पास संसाधन स्ट्रिंग के प्रकार (जैसे पाठ / सादे या पाठ / HTML) को इंगित करने के लिए कोई विनिर्देश नहीं है। हालाँकि, एक वर्कअराउंड है, जो डेवलपर को एक्सएमएल फ़ाइल के भीतर इसे निर्दिष्ट करने की अनुमति देगा।

  1. निर्दिष्ट करने के लिए एक कस्टम विशेषता परिभाषित करें कि Android: पाठ विशेषता html है।
  2. एक उपवर्गित TextView का उपयोग करें।

एक बार जब आप इन्हें परिभाषित करते हैं, तो आप बिना सेटटैक्स (Html.fromHtml (...)) को कॉल किए बिना अपने आप को HTML के साथ xml फ़ाइलों में व्यक्त कर सकते हैं। मैं बल्कि हैरान हूं कि यह दृष्टिकोण एपीआई का हिस्सा नहीं है।

यह समाधान इस हद तक काम करता है कि एंड्रॉइड स्टूडियो सिम्युलेटर टेक्स्ट को HTML के रूप में प्रदर्शित करेगा।

यहां छवि विवरण दर्ज करें

Res / मान / strings.xml (HTML के रूप में स्ट्रिंग संसाधन)

<resources>
<string name="app_name">TextViewEx</string>
<string name="string_with_html"><![CDATA[
       <em>Hello</em> <strong>World</strong>!
 ]]></string>
</resources>

Layout.xml (केवल प्रासंगिक भाग)

कस्टम विशेषता नामस्थान की घोषणा करें, और android_ex: isHtml विशेषता जोड़ें। इसके अलावा TextView के उपवर्ग का उपयोग करें।

<RelativeLayout
...
xmlns:android_ex="http://schemas.android.com/apk/res-auto"
...>

<tv.twelvetone.samples.textviewex.TextViewEx
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/string_with_html"
    android_ex:isHtml="true"
    />
 </RelativeLayout>

Res / मान / attrs.xml (उपवर्ग के लिए कस्टम विशेषताओं को परिभाषित करें)

 <resources>
<declare-styleable name="TextViewEx">
    <attr name="isHtml" format="boolean"/>
    <attr name="android:text" />
</declare-styleable>
</resources>

TextViewEx.java (TextView का उपवर्ग)

 package tv.twelvetone.samples.textviewex;

 import android.content.Context;
 import android.content.res.TypedArray;
 import android.support.annotation.Nullable;
 import android.text.Html;
 import android.util.AttributeSet;
 import android.widget.TextView;

public TextViewEx(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextViewEx, 0, 0);
    try {
        boolean isHtml = a.getBoolean(R.styleable.TextViewEx_isHtml, false);
        if (isHtml) {
            String text = a.getString(R.styleable.TextViewEx_android_text);
            if (text != null) {
                setText(Html.fromHtml(text));
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        a.recycle();
    }
}
}

यह दृष्टिकोण बेहतर होगा, यदि ऐप हर जगह HTML.fromHtml को कॉल करने के बजाय कई स्थानों पर HTML स्वरूपित तारों का उपयोग करता है। ऐप अपने आप में सामान्य के लिए दो और HTML के लिए एक दृश्य होगा।
मंजू

10

नवीनतम अद्यतन:

Html.fromHtml(string);// Android N संस्करणों के बाद हटा दिया गया है।

निम्नलिखित कोड Android N और इसके बाद के संस्करण को समर्थन देते हैं ...

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml(yourHtmlString,Html.FROM_HTML_MODE_LEGACY));
}

else 
{
textView.setText(Html.fromHtml(yourHtmlString));
}

3
  String termsOfCondition="<font color=#cc0029>Terms of Use </font>";
  String commma="<font color=#000000>, </font>";
  String privacyPolicy="<font color=#cc0029>Privacy Policy </font>";
  Spanned text=Html.fromHtml("I am of legal age and I have read, understood, agreed and accepted the "+termsOfCondition+commma+privacyPolicy);
        secondCheckBox.setText(text);

2

मेरे पास एक और मामला है जब मुझे सीडीएमए को एक्सएमएल में डालने का कोई मौका नहीं है क्योंकि मुझे सर्वर से स्ट्रिंग HTML प्राप्त होता है।

यहाँ मैं एक सर्वर से मिलता है:

<p>The quick brown&nbsp;<br />
fox jumps&nbsp;<br />
 over the lazy dog<br />
</p>

यह अधिक जटिल लगता है लेकिन समाधान बहुत सरल है।

private TextView textView;

protected void onCreate(Bundle savedInstanceState) { 
.....
textView = (TextView) findViewById(R.id.text); //need to define in your layout
String htmlFromServer = getHTMLContentFromAServer(); 
textView.setText(Html.fromHtml(htmlFromServer).toString());

}

आशा करता हूँ की ये काम करेगा!
Linh


4
getHTMLContentFromAServer () फ़ंक्शन
पल्लवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.