SpannableString: установить фон для каждого слова не работает должным образом на мультилинии - PullRequest
0 голосов
/ 13 октября 2018

Я использую этот пользовательский класс для форматирования каждого тега в TextView:

public class ExerciseRoundedBackgroundSpan extends ReplacementSpan {

    private static int CORNER_RADIUS = 8;
    private static int sBackgroundColor = Integer.MAX_VALUE;
    private static int sTextColor = Integer.MAX_VALUE;

    public ExerciseRoundedBackgroundSpan() {
        super();
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), bottom);
        paint.setColor(getBackgroundColor());
        canvas.drawRoundRect(rect, CORNER_RADIUS, CORNER_RADIUS, paint);
        paint.setColor(getTextColor());
        canvas.drawText(text, start, end, x, y, paint);
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        return Math.round(paint.measureText(text, start, end));
    }

    private float measureText(Paint paint, CharSequence text, int start, int end) {
        return paint.measureText(text, start, end);
    }

    private int getBackgroundColor() {
        if (sBackgroundColor == Integer.MAX_VALUE) {
            sBackgroundColor = MyApplication.getInstance().getResources().getColor(R.color.exercise_tag);
        }
        return sBackgroundColor;
    }

    private int getTextColor() {
        if (sTextColor == Integer.MAX_VALUE) {
            sTextColor = Color.WHITE;
        }
        return sTextColor;
    }
}

Он работает почти правильно, за исключением нескольких строк: как вы можете видеть на этом скриншоте, на красном прямоугольнике фонусечено и между строками (синий прямоугольник) нет пробела (я хочу пробел между строками):

enter image description here

Определение My TextView (очень просто):

<androidx.appcompat.widget.AppCompatTextView
                        android:id="@+id/tags"
                        style="@style/ItemTags"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content" />

И здесь метод разделения каждого слова и применения фона:

protected SpannableStringBuilder getSpannableStringBuilder(ArrayList<String> tags,
                                                               ItemExerciseAdapter.ViewHolder viewHolder) {
        SpannableStringBuilder stringBuilder = null;

        if (tags != null && tags.size() > 0) {
            stringBuilder = new SpannableStringBuilder();

            for (String tag : tags) {
                String thisTag = "  " + tag + "  ";
                stringBuilder.append(thisTag);
                stringBuilder.setSpan(new ExerciseRoundedBackgroundSpan(),
                        stringBuilder.length() - thisTag.length(), stringBuilder.length(),
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                stringBuilder.append(" ");
            }
        }

        return stringBuilder;
    }

Не могли бы вы помочь мне решить эти проблемы, пожалуйста?

Большое спасибо, ребята!

...