Android: TextView.setText () का उपयोग करके स्ट्रिंग का रंग भाग?


86

मैं टेक्स्ट के एक दृश्य को .setText ("") विधि के माध्यम से परिवर्तित करना चाह रहा हूं, जबकि पाठ के एक भाग को रंगना (या इसे बोल्ड, इटैलिक, पारदर्शी, आदि) बनाना और बाकी नहीं। उदाहरण के लिए:

title.setText("Your big island <b>ADVENTURE!</b>";

मुझे पता है कि उपरोक्त कोड गलत है, लेकिन यह वर्णन करने में मदद करता है कि मैं क्या हासिल करना चाहता हूं। यह मैं कैसे करूंगा?





Kotlin में समाधान Spans का उपयोग कर stackoverflow.com/a/59510004/11166067
Dmitrii लेओनोव

जवाबों:


201

स्पैन का प्रयोग करें ।

उदाहरण:

final SpannableStringBuilder sb = new SpannableStringBuilder("your text here");

// Span to set text color to some RGB value
final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(158, 158, 158)); 

// Span to make text bold
final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); 

// Set the text color for first 4 characters
sb.setSpan(fcs, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

// make them also bold
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

yourTextView.setText(sb);

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

1
पाठ को बोल्ड बनाने के लिए टिप्पणी कह रहा है, क्या इसे पाठ रंग बनाने के लिए अवधि कहना चाहिए?
रोहन

9
@ अगर आपकी समस्या है कि आपके शब्द में कितने अक्षर हैं, तो अपने स्ट्रिंग या स्ट्रिंगबर्ल पर लम्बाई () विधि का उपयोग करें या जो भी करें
अहमद एडेल इस्माइल

1
यदि
TextView

उत्तर को पढ़ने के दौरान शुरू में मुझे यह याद आया, लेकिन आपके एंड इंडेक्स को स्ट्रिंग में एंडिंग इंडेक्स +1 होना चाहिए (यानी पहले चार अक्षरों के लिए आपको [प्रारंभ, अंत] को [0, 4] के रूप में सेट करना है [0] नहीं। 3])
tir38

46
title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>")); 

2
यह मूल समस्या का एक अच्छा समाधान है जो कि चिह्नित उत्तर है।
बीएसएनएपीजेड

1
यदि आपके पास लाइन ब्रेक \ n है, तो यह लाइन ब्रेक को प्रदर्शित नहीं करता है।
लाइव-लव

8
नहीं, यह अच्छा नहीं है, कोई रंग सुविधा नहीं है, प्रश्न में वर्णित है लेकिन HTML () से धीमी विधि
विक्टर

1
तो <font color="#FFAADD>text</font>काम नहीं करेगा?
मीलो

25

मुझे उम्मीद है कि यह आपकी मदद करता है (यह बहु भाषा के साथ काम करता है)।

<string name="test_string" ><![CDATA[<font color="%1$s"><b>Test/b></font>]]> String</string>

और अपने जावा कोड पर, आप कर सकते हैं:

int color = context.getResources().getColor(android.R.color.holo_blue_light);
String string = context.getString(R.string.test_string, color);
textView.setText(Html.fromHtml(string));

इस तरह, केवल "टेस्ट" भाग रंगीन (और बोल्ड) होगा।


3
सबसे बढ़िया उत्तर। यह अंतरराष्ट्रीय स्तर पर तार के लिए पूरी तरह से काम करता है। इसके अलावा आपके स्ट्रिंग संसाधन के बीच में अपने रंगीन टेक्स्ट को रखने में सक्षम होने का फायदा है।
jt-gilkeson

आगे की व्याख्या के लिए यहां HTML मार्कअप सेक्शन के साथ स्टाइल देखें ।
एलिजाबेथ

17

यहाँ एक उदाहरण है जो किसी शब्द की सभी घटनाओं के लिए दिखेगा (केस असंवेदनशील), और उन्हें लाल रंग दें:

String notes = "aaa AAA xAaax abc aaA xxx";
SpannableStringBuilder sb = new SpannableStringBuilder(notes);
Pattern p = Pattern.compile("aaa", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(notes);
while (m.find()){
    //String word = m.group();
    //String word1 = notes.substring(m.start(), m.end());

    sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
editText.setText(sb);

मुझे आपका नाम पसंद है: P क्या मैं नए बैकग्राउंडर कौर के साथ विशिष्ट शब्द की पृष्ठभूमि को बदल सकता हूं (Color.parseColor ("# BFFFC6"))?
अजय पंड्या

8

आप एक का उपयोग कर सकते हैं Spannable एक पाठ के कुछ भागों को कुछ पहलुओं को देने के लिए । आप चाहें तो एक उदाहरण देख सकते हैं।

आह, सही यहाँ से stackoverflow

TextView TV = (TextView)findViewById(R.id.mytextview01); 
Spannable WordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");        
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.setText(WordtoSpan);

हम मल्टी लैंग्वेज टेक्स्ट के लिए स्टार्ट और एंड रेंज को कैसे कॉन्फ़िगर कर सकते हैं?
मुबारक

8

यदि आप Kotlin का उपयोग कर रहे हैं तो आप android-ktx लाइब्रेरी का उपयोग करके निम्नलिखित कार्य कर सकते हैं

val title = SpannableStringBuilder()
        .append("Your big island ")
        .bold { append("ADVENTURE") } 

titleTextField.text = title

boldपर एक विस्तार समारोह है SpannableStringBuilder। आप प्रलेखन देख सकते हैं यहां आपरेशन आप उपयोग कर सकते हैं की एक सूची के लिए।

एक और उदाहरण:

val ssb = SpannableStringBuilder()
            .color(green) { append("Green text ") }
            .append("Normal text ")
            .scale(0.5F) { append("Text at half size ") }
            .backgroundColor(green) { append("Background green") }

कहाँ पे green एक सुलझाया हुआ आरजीबी रंग है।

घोंसला बनाना संभव है, इसलिए आप अंतःस्थापित डीएसएल जैसी किसी चीज़ के साथ समाप्त होते हैं:

bold { underline { italic { append("Bold and underlined") } } }

build.gradleकाम करने के लिए आपको अपने ऐप मॉड्यूल स्तर में निम्नलिखित की आवश्यकता होगी :

repositories {
    google()
}

dependencies {
    implementation 'androidx.core:core-ktx:0.3'
}

इसके अलावा, कोई फर्क नहीं पड़ता कि मैं इसे किस रंग में डालता हूं, यह उसी बैंगनी रंग को दर्शाता है। val spannableStringBuilder = SpannableStringBuilder() spannableStringBuilder.bold { underline { color(R.color.test_color) { append(underlinedText) } } }
अभिषेक सक्सेना

4

यदि आप HTML का उपयोग करना चाहते हैं, तो आपको उपयोग करने की आवश्यकता है TextView.setText(Html.fromHtml(String htmlString))

यदि आप ऐसा अक्सर / बार-बार करना चाहते हैं, तो आपके पास एक कक्षा ( स्पैनएलेबल ) पर एक नज़र हो सकती है जो मैंने लिखा था, जैसा Html.fromHtml()कि बहुत कुशल नहीं है (यह अंदर एक बड़ी xml पार्सिंग मशीनरी का उपयोग कर रहा है)। यह इस ब्लॉग पोस्टिंग में वर्णित है ।


4
public static void setColorForPath(Spannable spannable, String[] paths, int color) {
    for (int i = 0; i < paths.length; i++) {
        int indexOfPath = spannable.toString().indexOf(paths[i]);
        if (indexOfPath == -1) {
            continue;
        }
        spannable.setSpan(new ForegroundColorSpan(color), indexOfPath,
                indexOfPath + paths[i].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}

का उपयोग करते हुए

Spannable spannable = new SpannableString("Your big island ADVENTURE");
Utils.setColorForPath(spannable, new String[] { "big", "ADVENTURE" }, Color.BLUE);

textView.setText(spannable);

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


3

            String str1 = "If I forget my promise to ";
            String penalty = "Eat breakfast every morning,";
            String str2 = " then I ";
            String promise = "lose my favorite toy";
           

            String strb = "<u><b><font color='#081137'>"+ penalty +",</font></b></u>";
            String strc = "<u><b><font color='#081137'>"+ promise + "</font></b></u>";
            String strd = str1 +strb+ str2 + strc;
           tv_notification.setText(Html.fromHtml(strd));

या इस कोड का उपयोग करें:

    SpannableStringBuilder builder = new SpannableStringBuilder();
            SpannableString text1 = new SpannableString(str1);
            text1.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.silver)), 0, str1.length() - 1, 0);
            builder.append(text1);

            SpannableString text2 = new SpannableString(penalty);
            text2.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.midnight)), 0, penalty.length(), 0);
            text2.setSpan(new UnderlineSpan(), 0, penalty.length(), 0);
            builder.append(text2);

            SpannableString text3 = new SpannableString(str2);
            text3.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.silver)),0, str2.length(), 0);
            builder.append(text3);


            SpannableString text4 = new SpannableString(promise);
            text4.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.midnight)), 0, promise.length(), 0);
            text4.setSpan(new UnderlineSpan(),0, promise.length(), 0);
            builder.append(text4);

          tv_notification.setText(builder);


3

मैं SpannableStringBuilderस्ट्रिंग की लंबाई की गणना करके सेटस्पैन को कॉल करने के बजाय एक-एक करके विभिन्न स्पैन को जोड़कर उपयोग करना पसंद करता हूं

के रूप में: (कोटलिन कोड)

val amountSpannableString = SpannableString("₹$amount").apply {
  // text color
  setSpan(ForegroundColorSpan("#FD0025".parseColor()), 0, length, 0)
  // text size
  setSpan(AbsoluteSizeSpan(AMOUNT_SIZE_IN_SP.spToPx(context)), 0, length, 0)
  // font medium
  setSpan(TypefaceSpan(context.getString(R.string.font_roboto_medium)), 0, length, 0)
}

val spannable: Spannable = SpannableStringBuilder().apply {
  // append the different spans one by one
  // rather than calling setSpan by calculating the string lengths
  append(TEXT_BEFORE_AMOUNT)
  append(amountSpannableString)
  append(TEXT_AFTER_AMOUNT)
}

परिणाम


2

आप दो या दो से अधिक स्पॅनटस कर सकते हैं। यह तरीका लंबाई मान का उपयोग करके गतिशील पाठ को रंगना आसान है।

SpannableStringBuilder span1 = new SpannableStringBuilder("Android");
ForegroundColorSpan color1=new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary));
span1.setSpan(color1, 0, span1.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

SpannableStringBuilder span2 = new SpannableStringBuilder("Love");
ForegroundColorSpan color2=new ForegroundColorSpan(getResources().getColor(R.color.colorSecondary));
span2.setSpan(color2, 0, span2.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

Spanned concatenated=(Spanned) TextUtils.concat(span1," => ",span2);

SpannableStringBuilder result = new SpannableStringBuilder(concatenated);

TextView tv = (TextView) rootView.findViewById(R.id.my_texview);
tv.setText(result, TextView.BufferType.SPANNABLE);

2

इस कोड को इसके सहायक का उपयोग करें

TextView txtTest = (TextView) findViewById(R.id.txtTest);
txtTest.setText(Html.fromHtml("This is <font color="#ff4343">Red</font> Color!"));

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