androidtypefacespannablestring

Set different font and color to part of a TextView


I tried this:

String s = "Some big string"
SpannableStringBuilder sb = new SpannableStringBuilder(s);
//normal font for 1st 9 chars
sb.setSpan(robotoRegular, 0,9,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//bold font for rest of the chars
sb.setSpan(robotoBold, 9,s.length(),Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//also change color for rest of the chars
sb.setSpan(new ForegroundColorSpan(Color.BLACK), 9,s.length(),Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(sb);

But this didn't work.

It only takes the latest setSpan, ie.., the Text color is being changed but not the font.


Solution

  • You have to use a TypefaceSpan instead of a Typeface.

    But since you are using a custom typeface you need to extend TypefaceSpan.

    Check out this answer and create CustomTypefaceSpan class.

    Now do the following:

    Typeface robotoRegular = Typeface.createFromAsset(getAssets(), "fonts/Roboto-Regular.ttf");
    Typeface robotoBold = Typeface.createFromAsset(getAssets(), "fonts/Roboto-Bold.ttf");
    
    TypefaceSpan robotoRegularSpan = new CustomTypefaceSpan("", robotoRegular);
    TypefaceSpan robotoBoldSpan = new CustomTypefaceSpan("", robotoBold);
    
    // normal font for 1st 9 chars
    sb.setSpan(robotoRegularSpan, 0, 9, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    // bold font for rest of the chars
    sb.setSpan(robotoBoldSpan, 9, s.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    // also change color for rest of the chars
    sb.setSpan(new ForegroundColorSpan(Color.BLUE), 9, s.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    textView.setText(sb);