एक से अधिक रंगीन टेक्स्ट के साथ सिंगल टेक्स्ट व्यू


167

जैसा कि शीर्षक कहता है, मैं जानना चाहता हूं कि क्या एक एकल टेक्स्टव्यू तत्व में दो अलग-अलग रंगीन वर्णों को प्राप्त करना संभव है।



1
यह डुप्लिकेट नहीं है क्योंकि पूछनेवाला विशेष रूप से रंग के लिए पूछ रहा है।
इकबाल

इसके लिए एक अच्छा पुस्तकालय है, मुझे लगता है: blog.stylingandroid.com/rialto-downloadable-fonts github.com/StylingAndroid/Rialto
Android डेवलपर

मैंने कुछ लाइब्रेरी भी लिखी हैं, जिसमें इस तरह का व्यवहार होता है: github.com/ha-yi/MultiColorTextView
Hayi Nukman

जवाबों:


328

हाँ, यदि आप स्वरूपित Stringसाथ htmlकी font-colorसंपत्ति तो यह विधि को पारितHtml.fromHtml(your text here)

String text = "<font color=#cc0029>First Color</font> <font color=#ffcc00>Second Color</font>";
yourtextview.setText(Html.fromHtml(text));

धन्यवाद मेरे लिए भी उपयोगी है। +1
हार्दिक जोशी

10
उपयोगकर्ता का उपयोग कर बचने के लिए मत भूलना Html.escapeHtml(str)
केलुनिक

1
एपीआई स्तर 1
2red13

3
बस एक चेतावनी। मैं एक मुद्दा रहा था जब मुझे अपने पाठ को अपरकेस में रखने की आवश्यकता थी। मैं android का उपयोग कर रहा था: XML में textAllCaps = "true" और, एक ही समय में, मेरे HTML सामग्री अपरकेस में थी। यह काम नहीं कर रहा था। मैंने XML विशेषता को हटा दिया है और यह अब ठीक काम कर रहा है। सावधान रहें, क्योंकि यदि आप कोड में setAllCaps () का उपयोग करते हैं, तो वही समस्या दिखाई देगी।
joao2fast4u

5
Html.fromHtml(String)अब उपयोग के बजाय हटा दिया गया है Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY)अधिक जानकारी यहां पाई जा सकती है।
जेडीबुरेल

165

आप HTML के बिना कई रंगों वाली रेखाएँ प्रिंट कर सकते हैं:

TextView textView = (TextView) findViewById(R.id.mytextview01);
Spannable word = new SpannableString("Your message");        

word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setText(word);
Spannable wordTwo = new SpannableString("Your new message");        

wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(wordTwo);

महान, धन्यवाद, भी कर सकते हैं BackgroundColorSpan। आपके उदाहरण में एक छोटा टाइपो है, WordToSpan और WordtoSpan, इस मामले पर ध्यान दें
जुवे

कैसे इकाई के बारे में एक ही बार TextView परीक्षण सुनिश्चित करने के लिए है कि में Color.RED पाठ समाप्त होता है stackoverflow.com/questions/26611533/...
sudocoder

1
मेरे लिए काम नहीं कर रहा है `java.lang.StringIndexOutOfBoundsException: लंबाई = 3; सूचकांक = 12`
मुहम्मद बाबर

1
StringIndexOutOfBoundsException स्वयं व्याख्यात्मक। आप लंबाई से परे स्ट्रिंग तक पहुंच रहे हैं।
स्वप्निल कोतवाल

1
मेरे तार तय नहीं किए गए थे, इसलिए तार ऐप के रन समय पर उत्पन्न होंगे। मैंने इस प्रश्न के लगभग सभी उत्तरों की कोशिश की है। लेकिन केवल इस समाधान ने मेरे लिए काम किया।
एमडी। सब्बीर अहमद

33

आप Spannableअपने पर प्रभाव लागू करने के लिए उपयोग कर सकते हैं TextView:

यहाँ एक TextViewपाठ के पहले भाग को रंगने के लिए मेरा उदाहरण है (जब आप HTML उदाहरण के साथ स्ट्रिंग में कोडिंग के बजाय रंग को गतिशील रूप से सेट करने की अनुमति देते हैं!)

    mTextView.setText("Red text is here", BufferType.SPANNABLE);
    Spannable span = (Spannable) mTextView.getText();
    span.setSpan(new ForegroundColorSpan(0xFFFF0000), 0, "Red".length(),
             Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

इस उदाहरण में आप 0xFFFF0000 को एक से बदल सकते हैं getResources().getColor(R.color.red)


1
यदि आपको इस ऊपरी मामले की आवश्यकता है, तो बस टॉपरकैस () स्ट्रिंग्स।
ग्रीम

33

मैंने इस तरह किया है:

संदर्भ देखें

स्ट्रिंग और रंग पास करके टेक्स्ट पर रंग सेट करें :

private String getColoredSpanned(String text, String color) {
    String input = "<font color=" + color + ">" + text + "</font>";
    return input;
}

नीचे दिए गए कोड पर कॉल करके TextView / Button / EditText आदि पर टेक्स्ट सेट करें :

व्याख्यान दर्शन:

TextView txtView = (TextView)findViewById(R.id.txtView);

रंगीन स्ट्रिंग प्राप्त करें:

String name = getColoredSpanned("Hiren", "#800000");
String surName = getColoredSpanned("Patel","#000080");

अलग-अलग रंगों के साथ दो तारों के TextView पर टेक्स्ट सेट करें:

txtView.setText(Html.fromHtml(name+" "+surName));

किया हुआ


1
nyc एक, लेकिन HTml.fromHtml को API 24 से हटा दिया गया है
अनुराज आर।

आप कॉल के Html.fromHtml("...")साथ कॉल को बदल सकते हैंHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
स्टेंटेंट

31

SpannableStringBuilder का उपयोग करें

SpannableStringBuilder builder = new SpannableStringBuilder();

SpannableString str1= new SpannableString("Text1");
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0);
builder.append(str1);

SpannableString str2= new SpannableString(appMode.toString());
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0);
builder.append(str2);

TextView tv = (TextView) view.findViewById(android.R.id.text1);
tv.setText( builder, TextView.BufferType.SPANNABLE);

8

हे दोस्तों मैंने ऐसा किया है, इसे आज़माएं

TextView textView=(TextView)findViewById(R.id.yourTextView);//init

//here I am appending two string into my textView with two diff colors.
//I have done from fragment so I used here getActivity(), 
//If you are trying it from Activity then pass className.this or this; 

textView.append(TextViewUtils.getColoredString(getString(R.string.preString),ContextCompat.getColor(getActivity(),R.color.firstColor)));
textView.append(TextViewUtils.getColoredString(getString(R.string.postString),ContextCompat.getColor(getActivity(),R.color.secondColor)));

आपके अंदर TextViewUtils वर्ग इस विधि को जोड़ता है

 /***
 *
 * @param mString this will setup to your textView
 * @param colorId  text will fill with this color.
 * @return string with color, it will append to textView.
 */
public static Spannable getColoredString(String mString, int colorId) {
    Spannable spannable = new SpannableString(mString);
    spannable.setSpan(new ForegroundColorSpan(colorId), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    Log.d(TAG,spannable.toString());
    return spannable;
}

मैंने अभी अपडेट किया है, इसे एक बार देखें, यह मेरे लिए काम कर रहा है।
अब्दुल रिजवान

Myabe आप इस स्ट्रिंग का उपयोग करने के लिए Html.fromHtml का उपयोग करते हैं?
सर्गेई Shustikov

string.xml फ़ाइल के अंदर मैंने वैरिएबल बनाया है और इसे सेट किया है, यह मेरे लिए काम कर रहा है बस अब मैं यह कर रहा हूं, क्या आप कृपया अपना स्ट्रिंग यहां दे सकते हैं।
अब्दुल रिजवान

5

स्ट्रिंग फ़ाइल में स्ट्रिंग का उपयोग करना बेहतर है, जैसे:

    <string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
    </string>

उपयोग:

textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)

4

मैंने अन्य प्रश्न के लिए कुछ कोड नीचे लिखे हैं, जो कि इस एक के समान है, लेकिन उस प्रश्न का दोहराव हो गया है, इसलिए मैं वहां जवाब नहीं दे सकता, इसलिए मैं अपना कोड यहां डाल रहा हूं अगर कोई उसी आवश्यकता की तलाश में है।

यह पूरी तरह से काम करने वाला कोड नहीं है, इसे काम करने के लिए आपको कुछ छोटे बदलाव करने होंगे।

यहाँ कोड है:

मैंने स्पैनेबल टेक्स्ट का उपयोग करने के @Gememe विचार का उपयोग किया है।

String colorfulText = "colorfulText";       
    Spannable span = new SpannableString(colorfulText);             

    for ( int i = 0, len = colorfulText.length(); i < len; i++ ){
        span.setSpan(new ForegroundColorSpan(getRandomColor()), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                     
    }   

    ((TextView)findViewById(R.id.txtSplashscreenCopywrite)).setText(span);

यादृच्छिक रंग विधि:

  private int getRandomColor(){
        Random rnd = new Random();
        return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    }

2

इसे इस्तेमाल करे:

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

2

HTML स्वरूपण के बजाय SpannableBuilder वर्ग का उपयोग करें जहां यह संभव है क्योंकि यह अधिक तेज़ है तो HTML प्रारूप पार्सिंग। Github धन्यवाद पर अपने स्वयं के बेंचमार्क "SpannableBuilder बनाम HTML" देखें !


1

बहुत बढ़िया जवाब! मैं इंद्रधनुषी रंग के पाठ के निर्माण के लिए Spannable का उपयोग करने में सक्षम था (इसलिए यह किसी भी रंग के सरणी के लिए दोहराया जा सकता है)। यहाँ मेरी विधि है, अगर यह किसी की मदद करता है:

private Spannable buildRainbowText(String pack_name) {
        int[] colors = new int[]{Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE};
        Spannable word = new SpannableString(pack_name);
        for(int i = 0; i < word.length(); i++) {
            word.setSpan(new ForegroundColorSpan(colors[i]), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return word;
    }

और फिर मैं बस सेट करता हूं (buildRainboxText (pack_name)); ध्यान दें कि मेरे द्वारा पास किए गए सभी शब्द 15 वर्णों के अंतर्गत हैं और यह केवल 3 बार 5 रंगों को दोहराता है - आप अपने उपयोग के लिए सरणी के रंगों / लंबाई को समायोजित करना चाहते हैं!


1
if (Build.VERSION.SDK_INT >= 24) {
     Html.fromHtml(String, flag) // for 24 API  and more
 } else {
     Html.fromHtml(String) // or for older API 
 }

24 एपीआई और अधिक के लिए (झंडा)

public static final int FROM_HTML_MODE_COMPACT = 63;
public static final int FROM_HTML_MODE_LEGACY = 0;
public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;
public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;
public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;

और जानकारी


1

चूंकि एपीआई 24 आपके पास FROM_HTML_OPTION_USE_CSS_COLORS है, इसलिए आप सीएसएस में रंगों को परिभाषित करने के बजाय इसे हर समय font color=" बहुत स्पष्ट रूप से दोहरा सकते हैं - जब आपके पास कुछ html हैं और आप कुछ पूर्वनिर्धारित टैग को हाइलाइट करना चाहते हैं - तो आपको बस अपने HTML के ऊपर CSS टुकड़ा जोड़ने की आवश्यकता है


0

25 जून 2020 को @canerkaseler द्वारा

मैं कोटलिन उत्तर साझा करना चाहूंगा :

fun setTextColor(tv:TextView, startPosition:Int, endPosition:Int, color:Int){
    val spannableStr = SpannableString(tv.text)

    val underlineSpan = UnderlineSpan()
    spannableStr.setSpan(
        underlineSpan,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    val backgroundColorSpan = ForegroundColorSpan(this.resources.getColor(R.color.agreement_color))
    spannableStr.setSpan(
        backgroundColorSpan,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    val styleSpanItalic = StyleSpan(Typeface.BOLD)
    spannableStr.setSpan(
        styleSpanItalic,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    tv.text = spannableStr
}

के बाद, फ़ंक्शन के ऊपर कॉल करें। आप एक से अधिक कॉल कर सकते हैं:

setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)

आउटपुट: आप एक दूसरे के साथ अलग और अलग रंग देख सकते हैं।

@canerkaseler

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