Custom TextView in android with different color words

前端 未结 3 1912
醉酒成梦
醉酒成梦 2020-12-05 03:23

Is it possible to have a textview to have different color for every word? Or even every letter? I tried extending textview and creating it but howe

相关标签:
3条回答
  • 2020-12-05 03:48

    Yes, you can do this with Spannable and SpannableStringBuilder. See Is there any example about Spanned and Spannable text for one example.

    For the various ways to format text (background color, foreground color, clickable, etc.), see CharacterStyle.

    0 讨论(0)
  • 2020-12-05 04:00

    The SpannableString class allows you to easily format certain pieces (spans) of a string one way and other pieces another by applying extensions of CharacterStyle (i.e. ForegroundColorSpan) via the setSpan method.

    You can try This:

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        richTextView = (TextView)findViewById(R.id.rich_text);
    
        // this is the text we'll be operating on
        SpannableString text = new SpannableString("Lorem ipsum dolor sit amet");
    
        // make "Lorem" (characters 0 to 5) red
        text.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);
    
        // make "ipsum" (characters 6 to 11) one and a half time bigger than the textbox
        text.setSpan(new RelativeSizeSpan(1.5f), 6, 11, 0);
    
        // make "dolor" (characters 12 to 17) display a toast message when touched
        final Context context = this;
        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "dolor", Toast.LENGTH_LONG).show();
            }
        };
        text.setSpan(clickableSpan, 12, 17, 0);
    
        // make "sit" (characters 18 to 21) struck through
        text.setSpan(new StrikethroughSpan(), 18, 21, 0);
    
        // make "amet" (characters 22 to 26) twice as big, green and a link to this site.
        // it's important to set the color after the URLSpan or the standard
        // link color will override it.
        text.setSpan(new RelativeSizeSpan(2f), 22, 26, 0);
        text.setSpan(new URLSpan("http://www.chrisumbel.com"), 22, 26, 0);
        text.setSpan(new ForegroundColorSpan(Color.GREEN), 22, 26, 0);
    
        // make our ClickableSpans and URLSpans work
        richTextView.setMovementMethod(LinkMovementMethod.getInstance());
    
        // shove our styled text into the TextView        
        richTextView.setText(text, BufferType.SPANNABLE);
    }
    

    The result will look like this:

    enter image description here

    For more detail see Chris Umbel blog.

    0 讨论(0)
  • 2020-12-05 04:10

    Use android.text.Spannable

    final SpannableStringBuilder str = new SpannableStringBuilder(text);
    str.setSpan(
        new ForegroundColorSpan(Color.BLUE), 
        wordStart, 
        wordEnd, 
        SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE
    );
    myTextView.setText(str);
    

    EDIT: To make all "Java" green

    final Pattern p = Pattern.compile("Java");
    final Matcher matcher = p.matcher(text);
    
    final SpannableStringBuilder spannable = new SpannableStringBuilder(text);
    final ForegroundColorSpan span = new ForegroundColorSpan(Color.GREEN);
    while (matcher.find()) {
        spannable.setSpan(
            span, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        );
    }
    myTextView.setText(spannable);
    
    0 讨论(0)
提交回复
热议问题