7

I have a TextView with the font sans-serif-light. To link some words inside, I set a text as a Spannable like this:

final Spannable text = new SpannableString(textView.getText());
final Matcher matcher = PATTERN_TAG.matcher(text);
while (matcher.find()) {
    text.setSpan(span, startIndex, endIndex, 0);
}
textView.setText(text);
textView.setMovementMethod(LinkMovementMethod.getInstance());

The Span that I apply sets the word's font to sans-serif-medium like this:

public abstract class ClickableTagSpan extends ClickableSpan {

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
    }
}

text get's cut off on the right edge

The problem is that the text becomes too wide for the TextView in some rows since the width of the medium font is larger than the light font that was orginally set. The TextView simply cuts off the text on the right edge. How can I get the TextView to respect the correct width of the text?

Matthias Robbers
  • 15,689
  • 6
  • 63
  • 73

1 Answers1

8

Solved it by setting an additional TypefaceSpan, rather than modifying the ClickableSpan.

text.setSpan(clickableSpan, startIndex, endIndex, 0);
text.setSpan(new TypefaceSpan("sans-serif-medium"), startIndex, endIndex, 0);

This makes the TextView correctly wrap the text.

Matthias Robbers
  • 15,689
  • 6
  • 63
  • 73
  • Thanks man you're a pro. Also I found out that you can remove ds.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL)); from your updateDrawState(TextPaint ds) method. – Muhammad Faizan Sep 30 '20 at 12:07