टेक्स्ट व्यू में एक शब्द का टेक्स्ट कलर बदलें


97

मैं एक तरह से एक में एक शब्द का एक पाठ का रंग बदलने के लिए देख रहा हूँ TextViewएक के भीतर से Activity

उदाहरण के लिए, इसके साथ:

String first = "This word is ";
String next = "red"
TextView t = (TextView) findViewById(R.id.textbox);
t.setText(first + next);

मैं nextपाठ का रंग लाल करने के लिए कैसे बदलूंगा?




जवाबों:


172

सबसे आसान तरीका मुझे पता है कि सिर्फ html का उपयोग करना है।

String first = "This word is ";
String next = "<font color='#EE0000'>red</font>";
t.setText(Html.fromHtml(first + next));

लेकिन इसके लिए आपको TextView का पुनर्निर्माण करना होगा जब (यदि?) आप रंग बदलना चाहते हैं, जिससे परेशानी हो सकती है।


1
यह निश्चित रूप से सबसे सरल तरीका है लेकिन रंग नहीं होना चाहिए = '# EE0000' हेक्साडेसिमल रंग को दर्शाने के लिए पाउंड प्रतीक की आवश्यकता है।
टॉम

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

ठीक है, यह सुनिश्चित करने के लिए! इसके अलावा, जैसा कि मैंने पाया कि आप 8 अंकों के हेक्स कोड का उपयोग नहीं कर सकते हैं ताकि कोई अल्फा घटक न हो। उस एक पल के लिए मुझे स्टम्प किया।
टॉम

का उपयोग कर fromHtmlअब हटा दिया गया है
एलेक्स जोलीग

Html.fromHtmlपदावनत किया गया है। यह समाधान मेरे लिए काम किया!
coderpc

74
t.setText(first + next, BufferType.SPANNABLE);
Spannable s = (Spannable)t.getText();
int start = first.length();
int end = start + next.length();
s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

आपको स्पैनेबल का उपयोग करना होगा यह आपको कुछ पाठ का आकार बढ़ाने, इसे बोल्ड बनाने आदि ... यहां तक ​​कि कुछ छवि में भी डाल सकता है।


4
अच्छा जवाब, धन्यवाद। इस स्थिति में "स्टार्ट + नेक्स्ट.लिफ्टिंग ()" के बजाय "s.length ()" का उपयोग किया जा सकता है: int end = s.length ();
ओलेग

1
मामले में किसी को भी Xamarin.Android समाधान की तलाश में। आप अपने नियंत्रण की संपत्ति का SpannableStringउपयोग करके ऑब्जेक्ट असाइन कर सकते हैं TextFormatted
जमशेद कामरान

यह काम नहीं कर पाया। अंत बीके के समाधान के साथ जा रहा है।
2b77bee6-5445-4c77-b1eb-4df3e5

1. अगर कोई बिल्ड है तो इसका इस्तेमाल करना हमेशा बेहतर होता है। 2. आप के लिए क्या काम नहीं किया? यह समाधान पुराना है, बहुत पुराना है, कुछ एपिस बदल गए हैं, जोड़े गए, हटाए गए हैं, बग फिक्स किए गए हैं, जो वास्तव में काम करने में विफल रहे हैं?
कोडस्क्रबर

2
मुझे java.lang.String cannot be cast to android.text.Spannableत्रुटि मिलती है।
लैशगर

37

इस तरह से 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);

क्या कोई ऐसी चीज़ है जिसे मैं बदल सकता हूँ new ForegroundColorSpan(Color)ताकि पाठ अपने मूल डिफ़ॉल्ट रंग को बरकरार रख सके?
cjnash

टेक्स्टव्यू के बीच में सादा पाठ (स्ट्रिंग) कैसे जोड़ें?
राघवेंद्र एम

5

लंबे स्ट्रिंग के लिए आप इसका उपयोग कर सकते हैं:

String help = getString(R.string.help);
help = help.replace("some word", "<font color='#EE0000'>some word</font>");
txtDesc.setText(Html.fromHtml(help));

2

यदि आप Stringकिसी TextViewपाठ के अंदर किसी विशिष्ट के सभी उदाहरणों की स्थिति को बदलना चाहते हैं (केस असंवेदनशील) तो आप StringBuilders और SpannableStringजैसे उपयोग कर सकते हैं :

StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString());
StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString));
SpannableString spannableString = new SpannableString(myTextView.getText().toString());

int counter = 0;
int index = 0;

for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++)
{
    counter = 0;
    if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index)))
    {
        counter++;
        index++;
        for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++)
        {
            if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index)))
            {
                counter++;
                index++;
            }
            else
            {
                index++;
                if (index % mySearchedString.length() == 0)
                {
                    index = 0;
                }
                break;
             }
        }
        if (counter == mySearchedString.length() - 1) // A match
        {
            spannableString.setSpan(new ForegroundColorSpan(Color.RED), i,
                                i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red)
            index = 0;
            continue;
        }
        else
        {
            index = 0;
            continue;
        }
    }
}
myTextView.setText(spannableString);

}

  • पूरे TextViewपाठ को एक के अंदर संग्रहीत करें StringBuilder
  • खोजे गए स्ट्रिंग को एक के अंदर स्टोर करें StringBuilder
  • TextViewएक के अंदर wholre पाठ संग्रहीत करेंSpannableString
  • पाठ के Stringअंदर के सभी उदाहरणों को खोजने के लिए एक सरल ऑपरेशन TextViewकरें और पहुंचने पर उन्हें बदल दें।
  • का पाठ मान सेट TextViewकरने के लिए SpannableString

1

मैंने अपने खुद के usecase के लिए कोटलिन में एक उपयोगिता फ़ंक्शन लागू किया और शायद किसी और के लिए उपयोगी।

fun getCusomTextWithSpecificTextWithDiffColor(textToBold: String, fullText: String,
                                                  targetColor: Int) =
            SpannableStringBuilder(fullText).apply {
                setSpan(ForegroundColorSpan(targetColor),
                        fullText.indexOf(textToBold),
                        (fullText.indexOf(textToBold) + textToBold.length),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }

मैं इसका उपयोग कैसे कर रहा हूं:

context?.let {
        infoMessage.text = AppUtils.getCusomTextWithSpecificTextWithDiffColor(
                wordAsBold,
                completeSentence, ContextCompat.getColor(it, R.color.white))
    }

1

उपयोग:

makeTextBold("Your order is accepted","accepted", textView);
makeTextBold("Your order is canceled","canceled", textView);

समारोह:

public static void makeTextBold(String sentence, String word, AppCompatTextView textView) {
    SpannableStringBuilder builder = new SpannableStringBuilder();
    int startIndex = sentence.indexOf(word.toLowerCase().trim());
    int endIndex = startIndex + word.toLowerCase().trim().length();
    SpannableString spannableString = new SpannableString(sentence);
    StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
    spannableString.setSpan(boldSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To make text Bold
    spannableString.setSpan(new ForegroundColorSpan(Color.RED), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To change color of text
    builder.append(spannableString);
    textView.setText(builder, TextView.BufferType.SPANNABLE);
}

0

मुझे लगता है कि एक स्ट्रिंग में किसी शब्द को रंगने के लिए यह अधिक पठनीय है, यह शायद थोड़ा अधिक कुशल है क्योंकि आप एक बार लिखते हैं

    String str  = YOUR_STRING
    Spannable s = new SpannableString(str);
    int start = str.indexOf(err_word_origin);
    int end =  start + err_word_origin.length();
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    YOUR_TEXT_VIEW.setText(s , TextView.BufferType.SPANNABLE);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.