क्या TextView के अंदर कई शैलियों का होना संभव है?


547

क्या TextView के अंदर पाठ के विभिन्न टुकड़ों के लिए कई शैलियों को सेट करना संभव है?

उदाहरण के लिए, मैं पाठ को इस प्रकार सेट कर रहा हूं:

tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);

क्या प्रत्येक पाठ तत्व के लिए एक अलग शैली होना संभव है? जैसे, लाइन 1 बोल्ड, वर्ड 1 इटैलिक, आदि।

डेवलपर गाइड के सामान्य कार्य और Android में उन्हें कैसे करना है, इसमें टेक्स्ट का चयन, हाइलाइटिंग या स्टाइलिंग भाग शामिल हैं :

// Get our EditText object.
EditText vw = (EditText)findViewById(R.id.text);

// Set the EditText's text.
vw.setText("Italic, highlighted, bold.");

// If this were just a TextView, we could do:
// vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);
// to force it to use Spannable storage so styles can be attached.
// Or we could specify that in the XML.

// Get the EditText's internal text storage
Spannable str = vw.getText();

// Create our span sections, and assign a format to each.
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

लेकिन वह पाठ के अंदर स्पष्ट स्थिति संख्याओं का उपयोग करता है। क्या ऐसा करने के लिए एक क्लीनर तरीका है?


6
यदि TextView स्ट्रिंग स्थिर है, तो आप स्ट्रिंग संसाधन फ़ाइल में html <b>, <i>, और <u> टैग जोड़ सकते हैं और वे स्वचालित रूप से लागू हो जाएंगे। Eg <TextView android: text = "@ string / test" /> जहां @ string / test <string> <b> bold </ b>, <i> italic </ i> </ string>
greg7gkb

2
+1 @ greg7gkb! कुंजी शब्द 'स्थिर है।' मैं अपने बालों को यह सोचकर खींच रहा था कि मेरे कुछ तार <b> के साथ काम क्यों करते हैं और कुछ नहीं। जिनके पास चर नहीं थे।
स्कॉट बिग्स

जवाबों:


694

मामले में, कोई भी सोच रहा है कि यह कैसे करना है, यहां एक तरीका है: (फिर से मार्क के लिए धन्यवाद!)

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
            "<small>" + description + "</small>" + "<br />" + 
            "<small>" + DateAdded + "</small>"));

इस पद्धति द्वारा समर्थित टैग की अनौपचारिक सूची के लिए, इस लिंक या इस प्रश्न को देखें: Android TextView द्वारा कौन से HTML टैग समर्थित हैं?


1
@ JANisGruzis: शायद ऐसा करने का एक तरीका ठूंठ विधि के माध्यम से है, कहते हैं, formatTextWhite(string text)कि पाठ को निम्नलिखित प्रारूप स्ट्रिंग में सम्मिलित करता है "<font size="..." color="..." face="...">%s</font>":।
लीजेंड

@Legend मैंने <font fgcolor = '# ffff5400'> <b> <बिग> "+" शीर्षक "+" </ बड़ा> </ b> </ font> का उपयोग किया है, लेकिन fgcolor / color (दोनों की कोशिश की) नहीं है काम कर रहे हैं ... क्या आप जानते हैं कि html
मुहम्मद बाबर

@ मुहम्मदबाबर: क्या आप यह कोशिश कर सकते हैं Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");:? मुझे याद है यह मेरे लिए कुछ समय पहले काम किया था। यकीन नहीं होता अगर यह अभी भी काम करता है।
लेजेंड

1
@ धन्यवाद धन्यवाद, लेकिन इसके लिए एक रास्ता मिल गया Html.fromHtml("<font color=\"#999999\">, इससे बचने के दृश्यों ने मेरे लिए काम किया :) ...
मुहम्मद बाबर

2
क्यों यह mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);किसी भी विचार का काम नहीं करता है धन्यवाद
शान Xeeshi

216

Html.fromHtml()अपने टेक्स्ट को बोल्ड और इटैलिक HTML टैग्स के साथ आज़माएँ और चिह्नित करें:

Spanned text = Html.fromHtml("This mixes <b>bold</b> and <i>italic</i> stuff");
textView.setText(text);

1
वास्तव में यह मुझे एक और सवाल पर ले जाता है: क्या HTML क्लास का उपयोग किए बिना अलग-अलग मार्कअप सेटअप के साथ इसके अंदर html टेक्स्ट के साथ एक टेक्स्टव्यू या तीन टेक्स्ट व्यू के साथ बेहतर है? मैं इसका स्पष्ट रूप से पहला अनुमान लगा रहा हूं, लेकिन बस इसकी पुष्टि करना चाहता था ...
किंवदंती

2
मुझे पता नहीं है कि Html.fromHtml () का समर्थन करने वाले टैग का पूरा रोस्टर क्या है - आपको स्रोत कोड को देखना होगा। इनलाइन मार्कअप और कई टेक्स्ट व्यू विजेट ओर्थोगोनल निर्णय होने चाहिए। यदि आपको पाठ के असतत बिट्स की सटीक नियुक्ति की आवश्यकता है, तो कई विजेट्स का उपयोग करें। इनलाइन मार्कअप का उपयोग करें यदि आप, उम, एक विजेट में इनलाइन मार्कअप की जरूरत है। याद रखें: एंड्रॉइड में कोई फ्लो -आउटआउट नहीं है, इसलिए पैराग्राफ बनाने के लिए कई टेक्स्ट व्यू को एक साथ स्ट्रिंग करना वास्तव में व्यावहारिक AFAIK नहीं है।
कॉमन्सवेअर

1
इसके लिए धन्यवाद ... वास्तव में, <small> टैग ने काम किया है ... इसलिए मैं इसे सरल रखूंगा और बस इसका उपयोग करूंगा ...
किंवदंती

1
@ टिमबोलैंड: आप अपने स्पैन को दूर फेंक रहे हैं monthText + " " + month.getYearLabel()। देखते हैं StringUtils.concat()
कॉमन्सवेयर

2
@ टिमबोलैंड: आप यह सब एक में कर सकते हैं: monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b>&nbsp;"+month.getYearLabel()))यदि आपको अलग-अलग टुकड़ों की आवश्यकता नहीं है।
कॉमन्सवेयर जुआर

191

थोड़ा ऑफ-टॉपिक, लेकिन मुझे यहां उल्लेख नहीं किया जाना बहुत उपयोगी लगा।

क्या होगा अगर हम string.xml संसाधन से Html पाठ को पढ़ना चाहते हैं और इस तरह इसे स्थानीय बनाना आसान बनाते हैं। CDATA इसे संभव बनाता है:

<string name="my_text">
  <![CDATA[
    <b>Autor:</b> Mr Nice Guy<br/>
    <b>Contact:</b> myemail@grail.com<br/>
    <i>Copyright © 2011-2012 Intergalactic Spacebar Confederation </i>
  ]]>
</string> 

हमारे जावा कोड से अब हम इसे इस तरह उपयोग कर सकते हैं:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml(getString(R.string.my_text))); 

मुझे इस काम की उम्मीद नहीं थी। लेकिन यह किया है।

आशा है कि यह आप में से कुछ के लिए उपयोगी है!


2
आमतौर पर "झूठे" का अर्थ है कि आपने लुकअप टेबल पर एक अजीब मूल्य एक्सेस किया है। मुझे यह तब मिला जब मेरे पास R.id.ok और R.string.ok थे, और गलती से सही getString (R.string.ok) के बजाय getString (R.id.ok) का इस्तेमाल किया
जो प्लांट

क्या यह एक लेआउट-एक्सएमएल में भी काम करता है? जब मैं वहां स्ट्रिंग संसाधन का संदर्भ देता हूं "@string/someText"(जहां "someText" एक स्ट्रिंग्स में परिभाषित संसाधन है। xml), मुझे बस सभी HTML टैग के साथ 'टेक्स्ट' के रूप में स्ट्रिंग मिलती है।
Gee.E

3
मुझे यह सबसे अच्छा जवाब लगा। मुझे प्रेरित किया। मदद नहीं कर सका, लेकिन मेरे दो-सेंट के जवाब में भी डाल दिया। यहाँ समाधान gist.github.com/aegis1980/b138dcb2fd1b2e98aa30 आपको लेआउट फ़ाइल में असाइन करने की अनुमति देता है, इसलिए आपको पाठ संसाधन को प्रोग्रामेटिक रूप से असाइन करने की आवश्यकता नहीं है (और एंड्रॉइड स्टूडियो में पूर्वावलोकन कर सकते हैं!)
जॉन

126

अगर आपको html का उपयोग करने का मन नहीं है, तो आप बस एक style.xml बना सकते हैं और इसे इस तरह उपयोग कर सकते हैं:

TextView tv = (TextView) findViewById(R.id.textview);
SpannableString text = new SpannableString(myString);

text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

tv.setText(text, TextView.BufferType.SPANNABLE);

एक सरल एंड्रॉइड एप्लिकेशन पर कॉपी / पेस्ट करें, जिस पर आप काम कर रहे होंगे। आप देखेंगे कि एक ही टेक्स्टव्यू पर दो शैलियों को लागू किया जाएगा।
कैंट एंडरसन

क्षमा करें, मैं स्पष्ट नहीं था। यदि आपको उस स्थान को निर्दिष्ट करना है, जहां शैली को लागू करना है, तो यह स्थानीयकृत स्ट्रिंग्स के लिए काम नहीं करता है क्योंकि अनुक्रमणिका निश्चित रूप से हर स्थान के लिए अलग होगी।
जेफरी ब्लाटमैन

तुम सही हो। यदि आप कई भाषाओं का समर्थन कर रहे हैं, तो यह वह मार्ग नहीं होगा जिसे आप लेना चाहते हैं। जब तक आप सुनिश्चित नहीं थे कि स्ट्रिंग आकार नहीं बदलेगी ... उदाहरण के लिए एप्लिकेशन नाम।
केंट एंडरसन

9
मैं नहीं देखता कि क्यों l10n इस समाधान के साथ काम नहीं कर सकता। बस एक के बजाय अलग स्ट्रिंग्स प्राप्त करें: स्ट्रिंग फर्स्टपार्ट = गेटस्ट्रिंग (आर.स्ट्रिंग.लाइन 1); स्ट्रिंग दूसरीपार्ट = getString (R.string.line2); Spannable text = new SpannableString (firstPart + secondPart); text.setSpan (नया फ़ोरग्राउंडर कौरसपैन (Color.parseColor (TEXT_COLOR_FOR_FIRST_PART)), 0, firstPart.length (), Spannable.SPex_EXCLUSIVE_EXCLUSIVE); myTextView.setText (टेक्स्ट, TextView.BufferType.SPANNABLE);
रुई

5
@ रुई क्योंकि l10n स्थितीय है। आप वाक्यांश में शब्दों की स्थिति को हार्डकोड नहीं कर सकते हैं और फिर भी l10n हो सकते हैं। इसलिए आप $1%s is a happy $2%sस्ट्रिंग बंडलों में चीजों को देखते हैं । आपको टोकन को फिर से व्यवस्थित करने की अनुमति देनी होगी।
जेफरी ब्लाटमैन

60

SpannableStringHtml मार्कअप के बजाय इसका उपयोग करने के लिए अधिक हल्का वजन है । यह मुझे दृश्य उदाहरण देखने में मदद करता है इसलिए यहाँ एक पूरक उत्तर है।

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

यह एक सिंगल है TextView

// set the text
SpannableString s1 = new SpannableString("bold\n");
SpannableString s2 = new SpannableString("italic\n");
SpannableString s3 = new SpannableString("foreground color\n");
SpannableString s4 = new SpannableString("background color\n");
SpannableString s5 = new SpannableString("underline\n");
SpannableString s6 = new SpannableString("strikethrough\n");
SpannableString s7 = new SpannableString("bigger\n");
SpannableString s8 = new SpannableString("smaller\n");
SpannableString s9 = new SpannableString("font\n");
SpannableString s10 = new SpannableString("URL span\n");
SpannableString s11 = new SpannableString("clickable span\n");
SpannableString s12 = new SpannableString("overlapping spans\n");

// set the style
int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
s1.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), flag);
s2.setSpan(new StyleSpan(Typeface.ITALIC), 0, s2.length(), flag);
s3.setSpan(new ForegroundColorSpan(Color.RED), 0, s3.length(), flag);
s4.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, s4.length(), flag);
s5.setSpan(new UnderlineSpan(), 0, s5.length(), flag);
s6.setSpan(new StrikethroughSpan(), 0, s6.length(), flag);
s7.setSpan(new RelativeSizeSpan(2), 0, s7.length(), flag);
s8.setSpan(new RelativeSizeSpan(0.5f), 0, s8.length(), flag);
s9.setSpan(new TypefaceSpan("monospace"), 0, s9.length(), flag);
s10.setSpan(new URLSpan("https://developer.android.com"), 0, s10.length(), flag);
s11.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        Toast.makeText(getApplicationContext(), "Span clicked", Toast.LENGTH_SHORT).show();
    }
}, 0, s11.length(), flag);
s12.setSpan(new ForegroundColorSpan(Color.RED), 0, 11, flag);
s12.setSpan(new BackgroundColorSpan(Color.YELLOW), 4, s12.length(), flag);
s12.setSpan(new UnderlineSpan(), 4, 11, flag);

// build the string
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(s1);
builder.append(s2);
builder.append(s3);
builder.append(s4);
builder.append(s5);
builder.append(s6);
builder.append(s7);
builder.append(s8);
builder.append(s9);
builder.append(s10);
builder.append(s11);
builder.append(s12);

// set the text view with the styled text
textView.setText(builder);
// enables clicking on spans for clickable span and url span
textView.setMovementMethod(LinkMovementMethod.getInstance());

आगे के अध्ययन

यह उदाहरण मूल रूप से यहीं से प्रेरित था ।


5
आपकी पोस्ट SpannableString के बारे में Google डॉक्युमेंटेशन से बेहतर है .. धन्यवाद
MBH

क्या इसने उन छवियों का समर्थन किया है जो वेब सेवा से हैं। मेरी जैसी आवश्यकता।
मोहनराज एस

@MohanRajS SpannableStrings यूनिकोड इमोजी का समर्थन करता है, लेकिन अन्य छवियों का नहीं।
सुरगाछ

@Suragch ने त्वरित प्रतिक्रिया के लिए धन्यवाद दिया, लेकिन मेरी आवश्यकता jpg, png है। संभाल करने के लिए केवल विकल्प वेबव्यू है? :(
मोहनराज एस

43

समर्थित टैग की सूची है:

यदि आप एक स्ट्रिंग संसाधन का उपयोग करते हैं, तो आप HTML संकेतन का उपयोग करके कुछ सरल स्टाइलिंग जोड़ सकते हैं, जैसे बोल्ड या इटैलिक। वर्तमान में समर्थित टैग हैं: B(बोल्ड), I(इटैलिक), U(अंडरलाइन), TT(मोनोस्पेस),BIG , SMALL, SUP(सुपरस्क्रिप्ट), SUB(सबस्क्रिप्ट), और STRIKE(स्ट्राइकथ्रू)। इसलिए, उदाहरण के लिए, res/values/strings.xmlआप यह घोषित कर सकते हैं:

<resource>
    <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

( Http://developer.android.com/guide/faq/commontasks.html#selectingtext - वेब आर्काइव लिंक से, <resource>टाइपो मूल में है!)

यह यह भी दर्शाता है कि Html.fromHtmlसाधारण मामलों में वास्तव में आवश्यक नहीं है।


Html.fromHtml अक्सर टेक्स्ट को स्टाइल करने का एक आसान तरीका है। साथ ही, यह लिंक पहले से ही मूल प्रश्न में है।
Intrications

17

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

मुझे आशा है कि इससे दूसरों को भी यही काम करने में मदद मिलेगी - मुझे नहीं पता कि फ्रेमवर्क में यह आसान क्यों नहीं है।

मेरे तार इस तरह दिखते हैं:


<string name="my_text">{0} You will need a {1} to complete this assembly</string>
<string name="text_sub0">1:</string>
<string name="text_sub1">screwdriver, hammer, and measuring tape</string>

यहाँ शैलियों रहे हैं:


<style name="MainStyle">
    <item name="android:textSize">@dimen/regular_text</item>
    <item name="android:textColor">@color/regular_text</item>
</style>
<style name="style0">
    <item name="android:textSize">@dimen/paragraph_bullet</item>
    <item name="android:textColor">@color/standout_text</item>
    <item name="android:textStyle">bold</item>
</style>
<style name="style1">
    <item name="android:textColor">@color/standout_light_text</item>
    <item name="android:textStyle">italic</item>
</style>

यहाँ मेरा कोड है जो मेरे स्वरूप को कॉल करता है। विधि विधि:


SpannableString formattedSpan = formatStyles(getString(R.string.my_text), getString(R.string.text_sub0), R.style.style0, getString(R.string.main_text_sub1), R.style.style1);
textView.setText(formattedSpan, TextView.BufferType.SPANNABLE);

प्रारूप विधि:


private SpannableString formatStyles(String value, String sub0, int style0, String sub1, int style1)
{
    String tag0 = "{0}";
    int startLocation0 = value.indexOf(tag0);
    value = value.replace(tag0, sub0);

    String tag1 = "{1}";
    int startLocation1 = value.indexOf(tag1);
    if (sub1 != null && !sub1.equals(""))
    {
        value = value.replace(tag1, sub1);
    }

    SpannableString styledText = new SpannableString(value);
    styledText.setSpan(new TextAppearanceSpan(getActivity(), style0), startLocation0, startLocation0 + sub0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    if (sub1 != null && !sub1.equals(""))
    {
        styledText.setSpan(new TextAppearanceSpan(getActivity(), style1), startLocation1, startLocation1 + sub1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    return styledText;
}

मुझे नहीं लगता कि यह स्ट्रिंग पुनर्स्थापना {0} और {1} के स्थानीयकृत संस्करण में काम करेगा। अगर startLocation1 है तो आपको startLocation0 को बदलना पड़ सकता है। StartLocation0
जोनाथन


8

यहाँ HTMLBuilder का उपयोग करने का एक आसान तरीका है

    myTextView.setText(new HtmlBuilder().
                    open(HtmlBuilder.Type.BOLD).
                    append("Some bold text ").
                    close(HtmlBuilder.Type.BOLD).
                    open(HtmlBuilder.Type.ITALIC).
                    append("Some italic text").
                    close(HtmlBuilder.Type.ITALIC).
                    build()
    );

परिणाम:

कुछ बोल्ड टेक्स्ट कुछ इटैलिक टेक्स्ट


7

यदि आप xml में स्टाइल किए गए टेक्स्ट को जोड़ने में सक्षम होना चाहते हैं, तो आप टेक्स्ट व्यू और ओवरराइड सेटटैक्स () को बढ़ाते हुए एक कस्टम दृश्य बना सकते हैं:

public class HTMLStyledTextView extends TextView
{
    public HTMLStyledTextView(Context context) {
        super(context);
    }

    public HTMLStyledTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HTMLStyledTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setText(CharSequence text, BufferType type)
    {
       super.setText(Html.fromHtml(text.toString()), type);
    }
}

फिर, आप इसे इस तरह से उपयोग कर सकते हैं ( PACKAGE_NAMEअपने पैकेज के नाम के साथ बदलें ):

<PACKAGE_NAME.HTMLStyledTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="<![CDATA[
        <b>Bolded Text:</b> Non-Bolded Text
    ]]>"
/>

क्या यह एंड्रॉइड स्टूडियो में ठीक से पूर्वावलोकन करता है?
जेपीएम

7

जैसा कहा गया है, उपयोग करें TextView.setText(Html.fromHtml(String))

और अपने Html स्वरूपित स्ट्रिंग में इन टैग का उपयोग करें:

<a href="...">
<b>
<big>
<blockquote>
<br>
<cite>
<dfn>
<div align="...">
<em>
<font size="..." color="..." face="...">
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<i>
<img src="...">
<p>
<small>
<strike>
<strong>
<sub>
<sup>
<tt>
<u>

http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html


3

मैं भी

कैसे कोटलिन और Anko के साथ कुछ सुंदर मार्कअप का उपयोग करने के बारे में -

import org.jetbrains.anko.*
override fun onCreate(savedInstanceState: Bundle?) {
    title = "Created with Beautiful Markup"
    super.onCreate(savedInstanceState)

    verticalLayout {
        editText {
            hint = buildSpanned {
                append("Italic, ", Italic)
                append("highlighted", backgroundColor(0xFFFFFF00.toInt()))
                append(", Bold", Bold)
            }
        }
    }
}

ब्यूटीफुल मार्कअप के साथ बनाया गया


2

हां, इसका उपयोग संभव है SpannedString। यदि आप कोटलिन का उपयोग कर रहे हैं, तो इसका उपयोग करना और भी आसान हो जाता है core-ktx, क्योंकि यह करने के लिए एक डोमेन-विशिष्ट-भाषा (DSL) प्रदान करता है :

    val string: SpannedString = buildSpannedString {
        bold {
            append("1111")
        }
        append("Devansh")     
    }

इसके द्वारा दिए गए अधिक विकल्प हैं:

append("Hello There")
bold {
    append("bold")
    italic {
        append("bold and italic")
        underline {
            append("then some text with underline")
        }
    }
}

अंत में, आप बस कर सकते हैं:

textView.text = string

0

वास्तव में, Html ऑब्जेक्ट को छोड़कर, आप Spannable प्रकार की कक्षाओं का उपयोग भी कर सकते हैं, जैसे TextAppearanceSpan या TypefaceSpan और SpannableString togather। Html वर्ग भी इन तंत्रों का उपयोग करता है। लेकिन स्पैनबल प्रकार की कक्षाओं के साथ, आपको अधिक स्वतंत्रता है।


0

यह स्ट्रिंग की लंबाई () विधि का लाभ उठाने जितना आसान हो सकता है:

  1. स्ट्रिंग्स एक्सएमएल फ़ाइल में टेक्स्ट स्ट्रिंग को कई उप-स्ट्रिंग्स (एंड्रॉइड के दृष्टिकोण से एक अलग तार) में विभाजित करें, क्योंकि आपको विभिन्न शैलियों की आवश्यकता होती है, इसलिए यह हो सकता है: str1, str2, str3 (आपके मामले में, जैसा) जो एक साथ जुड़ने पर आपके द्वारा उपयोग किए जाने वाले पूरे एकल स्ट्रिंग हैं।

  2. और फिर बस "स्पान" विधि का पालन करें, जैसे आपने अपने कोड के साथ प्रस्तुत किया है - लेकिन एक एकल स्ट्रिंग के बजाय, सभी सब्सट्रेटिंग को एक एकल में जोड़ते हैं, प्रत्येक एक अलग कस्टम शैली के साथ।

आप अभी भी संख्याओं का उपयोग करते हैं, हालांकि सीधे नहीं - वे अब हार्डकोड फॉर्म नहीं लेते हैं (जैसा कि आपके कोड में है), लेकिन उन्हें संयुक्त लंबाई () विधियों के साथ प्रतिस्थापित किया जा रहा है (नोट दो सितारों पूर्ववर्ती और str प्रत्यय। लंबाई () परिवर्तन को पूरा करने के लिए निरपेक्ष संख्या के स्थान पर):

str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, **str.length()**, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

पहले स्ट्रिंग आकार के लिए, फिर str.length () + 1, str.length () + str2.length () दूसरे स्ट्रिंग आकार के लिए, और इसी तरह सभी सबस्ट्रिंग के बजाय, उदाहरण के लिए 0,7 या 8,19 और इसी तरह...


0

वेब पेज के निचले भाग में एंड्रॉइड स्ट्रिंग रिसोर्स के रूप में एक सहायक स्पैनेबल क्लास का उपयोग करना । आप इसे बनाकर CharSquencesऔर उन्हें एक शैली देकर संपर्क कर सकते हैं।

लेकिन उदाहरण में वे हमें देते हैं, सिर्फ बोल्ड, इटैलिक और यहां तक ​​कि टेक्स्ट को रंग देने के लिए है। मुझे CharSequenceउन्हें सेट करने के लिए कई शैलियों को एक में लपेटने की आवश्यकता थी TextView। इसलिए उस क्लास (मैंने इसे नाम दिया CharSequenceStyles) मैंने इस फ़ंक्शन को जोड़ा।

public static CharSequence applyGroup(LinkedList<CharSequence> content){
    SpannableStringBuilder text = new SpannableStringBuilder();
    for (CharSequence item : content) {
        text.append(item);
    }
    return text;
}

और देखने में मैंने इसे जोड़ा है।

            message.push(postMessageText);
            message.push(limitDebtAmount);
            message.push(pretMessageText);
            TextView.setText(CharSequenceStyles.applyGroup(message));

उम्मीद है इससे आपको मदद होगी!


0

स्पैनी SpannableString का उपयोग करने के लिए आसान बनाते हैं।

Spanny spanny = new Spanny("Underline text", new UnderlineSpan())
                .append("\nRed text", new ForegroundColorSpan(Color.RED))
                .append("\nPlain text");
textView.setText(spanny)

0

जैसा कि जॉन ने कहा , मेरे लिए यह सबसे अच्छा समाधान है और आपको रनटाइम पर किसी भी पाठ को सेट करने की आवश्यकता नहीं है, केवल इस कस्टम वर्ग HtmlmlextView का उपयोग करें

public class HtmlTextView extends TextView {

  public HtmlTextView(Context context) {
      super(context);
  }

  public HtmlTextView(Context context, AttributeSet attrs) {
      super(context, attrs);
  }

  public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) 
  {
      super(context, attrs, defStyleAttr);
  }

  @TargetApi(21)
  public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
      super(context, attrs, defStyleAttr, defStyleRes);
  }

  @Override
  public void setText(CharSequence s,BufferType b){
      super.setText(Html.fromHtml(s.toString()),b);
  }

}

और यह है, अब यह केवल अपने XML में डाल दिया

<com.fitc.views.HtmlTextView
    android:id="@+id/html_TV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_html" />

अपने Html स्ट्रिंग के साथ

<string name="example_html">
<![CDATA[
<b>Author:</b> Mr Donuthead<br/>
<b>Contact:</b> me@donut.com<br/>
<i>Donuts for life </i>
]]>

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