Android में TextView स्पैन का रंग सेट करें


206

क्या TextView में टेक्स्ट के सिर्फ स्पैन का रंग सेट करना संभव है?

मैं ट्विटर ऐप के समान कुछ करना चाहता हूं, जिसमें पाठ का एक हिस्सा नीला है। नीचे चित्र देखें:

वैकल्पिक शब्द
(स्रोत: twimg.com )

जवाबों:


429

एक और उत्तर बहुत समान होगा, लेकिन TextViewदो बार के पाठ को सेट करने की आवश्यकता नहीं होगी

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);

लेकिन मैं कई शब्दों के लिए रंग कैसे बदल सकता हूँ मैं सभी पाठ एक अवधि नहीं?
मुस्तफा हशीम

1
@mostafahashim पंक्ति 3 wordtoSpan.setSpan (नया फ़ोरग्राउंड कलरऑनस्पैन (Color.RED), 50, 80, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) दोहराते हुए कई स्पैन बनाएं;
अशरफ अलशावी

Kotlin + Spannable स्ट्रिंग समाधान इस प्रकार दिखाई देगा stackoverflow.com/questions/4032676/...
Dmitrii लेओनोव

81

यहाँ थोड़ा मदद समारोह है। जब आपके पास कई भाषाएँ हों तो बढ़िया!

private void setColor(TextView view, String fulltext, String subtext, int color) {
    view.setText(fulltext, TextView.BufferType.SPANNABLE);
    Spannable str = (Spannable) view.getText();
    int i = fulltext.indexOf(subtext);
    str.setSpan(new ForegroundColorSpan(color), i, i + subtext.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}

37

मैं हमेशा एक नई अवधारणा को समझने की कोशिश करते समय दृश्य उदाहरणों को मददगार पाता हूं।

पीछे का रंग

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

SpannableString spannableString = new SpannableString("Hello World!");
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(backgroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

अग्रभूमि रंग

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

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

मेल

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

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

आगे के अध्ययन


29

यदि आप अधिक नियंत्रण चाहते हैं, तो आप TextPaintकक्षा की जांच कर सकते हैं । यहाँ इसका उपयोग कैसे किया जाता है:

final ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(final View textView) {
        //Your onClick code here
    }

    @Override
    public void updateDrawState(final TextPaint textPaint) {
        textPaint.setColor(yourContext.getResources().getColor(R.color.orange));
        textPaint.setUnderlineText(true);
    }
};

getColor (पूर्णांक आईडी) Android 6.0 Marshmallow (एपीआई 23) पर हटाई गई है stackoverflow.com/questions/31590714/...
एका पुत्र

क्लिक श्रोता के साथ अच्छा जवाब।
मुहिमीनुर रहमान

20

अपने TextViewपाठ पाठ को सेट करें और ForegroundColorSpanअपने पाठ के लिए परिभाषित करें।

TextView textView = (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);    
textView.setText(wordtoSpan);

धन्यवाद! क्या पहले TextView को टेक्स्ट असाइन किए बिना ऐसा करना संभव है?
hpique

मैंने खुद को अच्छी तरह से समझाया नहीं। मुझे rephrase करते हैं। क्या पहली 3 पंक्तियाँ आवश्यक हैं? क्या आप सीधे स्ट्रिंग से स्पैनेबल ऑब्जेक्ट नहीं बना सकते हैं?
hpique

नहींं, आपको अग्रभूमि रंग बदलने के लिए अपने TextView के टेक्स्ट को बफर स्पैनबल में स्टोर करना होगा।
जोर्जेस

मैं रंग के साथ एक ही बात करना चाहता हूं प्लस मैं चाहता हूं कि रंगीन भाग को छोड़कर सब कुछ बोल्ड हो, मैं जिस हिस्से को इटैलिक करना चाहता हूं, मैं वह कैसे कर सकता हूं?
लुकप

1
स्पैन में क्लिक कैसे सेट करें?
ऋषभ श्रीवास्तव '

13

एक और तरीका जो कुछ स्थितियों में इस्तेमाल किया जा सकता है, वह स्पैनबल लेने वाले दृश्य के गुणों में लिंक रंग सेट करना है।

यदि आपके Spannable का उपयोग टेक्स्ट व्यू में किया जा रहा है, उदाहरण के लिए, आप XML में लिंक का रंग इस तरह सेट कर सकते हैं:

<TextView
    android:id="@+id/myTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColorLink="@color/your_color"
</TextView>

आप इसे कोड में भी सेट कर सकते हैं:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setLinkTextColor(your_color);

5

Spannable बनाने के लिए एक कारखाना है, और इस तरह कलाकारों से बचें:

Spannable span = Spannable.Factory.getInstance().newSpannable("text");

1
क्या आप स्पष्ट कर सकते हैं कि SpannableFactory का उपयोग कैसे करें? "पाठ" कैसा दिखना चाहिए?
पायोत्र

SpannableFactory द्वारा Spannable बनाने के बाद, तो इसका उपयोग कैसे करें?
एमबीएच

5

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

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

नीचे दिए गए कोड से टेक्स्टव्यू / बटन / एडिट टेक्स्ट आदि पर टेक्स्ट सेट करें :

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

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

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

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

TextView पर पाठ सेट करें:

txtView.setText(Html.fromHtml(name));

किया हुआ


4
String text = "I don't like Hasina.";
textView.setText(spannableString(text, 8, 14));

private SpannableString spannableString(String text, int start, int end) {
    SpannableString spannableString = new SpannableString(text);
    ColorStateList redColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{0xffa10901});
    TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, redColor, null);

    spannableString.setSpan(highlightSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(new BackgroundColorSpan(0xFFFCFF48), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(new RelativeSizeSpan(1.5f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    return spannableString;
}

आउटपुट:

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


आपको हसीना you पसंद नहीं है
अबू

3

बस स्वीकृत उत्तर को जोड़ने के लिए, जैसा कि सभी उत्तर android.graphics.Colorकेवल बात करने के लिए प्रतीत होते हैं : क्या होगा यदि मुझे जो रंग चाहिए वह परिभाषित है res/values/colors.xml?

उदाहरण के लिए, सामग्री डिज़ाइन रंगों को परिभाषित करें colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="md_blue_500">#2196F3</color>
</resources>

( android_material_design_colours.xmlआपका सबसे अच्छा दोस्त है)

फिर ContextCompat.getColor(getContext(), R.color.md_blue_500)जहां आप उपयोग करेंगे Color.BLUE, उसका उपयोग करें , ताकि:

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

हो जाता है:

wordtoSpan.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.md_blue_500)), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

जहाँ मैंने पाया कि:


2

इसके लिए मेरे पास एक कोटलिन एक्सटेंशन फंक्शन है

    fun TextView.setColouredSpan(word: String, color: Int) {
        val spannableString = SpannableString(text)
        val start = text.indexOf(word)
        val end = text.indexOf(word) + word.length
        try {
            spannableString.setSpan(ForegroundColorSpan(color), start, end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            text = spannableString
        } catch (e: IndexOutOfBoundsException) {
         println("'$word' was not not found in TextView text")
    }
}

अपने पाठ को टेक्स्टव्यू पर सेट करने के बाद इसका उपयोग करें

private val blueberry by lazy { getColor(R.color.blueberry) }

textViewTip.setColouredSpan("Warning", blueberry)

0
  1. उर लेआउट में टेक्स्टव्यू बनाएं
  2. इस कोड को ur MainActivity में पेस्ट करें

    TextView textview=(TextView)findViewById(R.id.textviewid);
    Spannable spannable=new SpannableString("Hello my name is sunil");
    spannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 5, 
    Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    textview.setText(spannable);
    //Note:- the 0,5 is the size of colour which u want to give the strring
    //0,5 means it give colour to starting from h and ending with space i.e.(hello), if you want to change size and colour u can easily

0

नीचे मेरे लिए पूरी तरह से काम करता है

    tvPrivacyPolicy = (TextView) findViewById(R.id.tvPrivacyPolicy);
    String originalText = (String)tvPrivacyPolicy.getText();
    int startPosition = 15;
    int endPosition = 31;

    SpannableString spannableStr = new SpannableString(originalText);
    UnderlineSpan underlineSpan = new UnderlineSpan();
    spannableStr.setSpan(underlineSpan, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    ForegroundColorSpan backgroundColorSpan = new ForegroundColorSpan(Color.BLUE);
    spannableStr.setSpan(backgroundColorSpan, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    StyleSpan styleSpanItalic  = new StyleSpan(Typeface.BOLD);

    spannableStr.setSpan(styleSpanItalic, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    tvPrivacyPolicy.setText(spannableStr);

उपरोक्त कोड के लिए आउटपुट

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


0

यहाँ कुछ जवाब अप टू डेट नहीं हैं। क्योंकि, आप (ज्यादातर मामलों में) अपने लिंक पर एक कस्टम क्लिक कार्रवाई जोड़ देंगे

इसके अलावा, जैसा कि प्रलेखन मदद द्वारा प्रदान किया गया है, आपके स्पेंड किए गए स्ट्रिंग लिंक रंग में एक डिफ़ॉल्ट होगा। "डिफ़ॉल्ट लिंक रंग थीम का उच्चारण रंग या Android है: textColorLink यदि यह विशेषता थीम में परिभाषित है"।

यहाँ यह सुरक्षित तरीके से करने का तरीका है।

 private class CustomClickableSpan extends ClickableSpan {

    private int color = -1;

    public CustomClickableSpan(){
        super();
        if(getContext() != null) {
            color = ContextCompat.getColor(getContext(), R.color.colorPrimaryDark);
        }
    }

    @Override
    public void updateDrawState(@NonNull TextPaint ds) {
        ds.setColor(color != -1 ? color : ds.linkColor);
        ds.setUnderlineText(true);
    }

    @Override
    public void onClick(@NonNull View widget) {
    }
}

फिर इसका उपयोग करने के लिए।

   String text = "my text with action";
    hideText= new SpannableString(text);
    hideText.setSpan(new CustomClickableSpan(){

        @Override
        public void onClick(@NonNull View widget) {
            // your action here !
        }

    }, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    yourtextview.setText(hideText);
    // don't forget this ! or this will not work !
    yourtextview.setMovementMethod(LinkMovementMethod.getInstance());

आशा है कि यह दृढ़ता से मदद करेगा!


0

डेवलपर डॉक्स से, स्पैनबल के रंग और आकार को बदलने के लिए:

1- एक कक्षा बनाएँ:

    class RelativeSizeColorSpan(size: Float,@ColorInt private val color: Int): RelativeSizeSpan(size) {

    override fun updateDrawState(textPaint: TextPaint?) {
        super.updateDrawState(textPaint)
        textPaint?.color = color
    } 
}

2 उस वर्ग का उपयोग करके अपना स्पैनेबल बनाएं:

    val spannable = SpannableStringBuilder(titleNames)
spannable.setSpan(
    RelativeSizeColorSpan(1.5f, Color.CYAN), // Increase size by 50%
    titleNames.length - microbe.name.length, // start
    titleNames.length, // end
    Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.