Как создать пустой абзац маркера BulletSpan? - PullRequest
3 голосов
/ 26 ноября 2011

Я хотел создать пустой абзац, но это не сработало.Это мой код:

EditText contentET = (EditText) findViewById(R.id.content);
contentET.setText("abc\n123\n");
Spannable s = contentET.getText();
s.setSpan(new BulletSpan(), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
s.setSpan(new BulletSpan(), 4, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
s.setSpan(new BulletSpan(), 7, 8, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
contentET.setText(s);

Когда я бегал над кодом, казалось, что эта строка не работает

s.setSpan(new BulletSpan(), 7, 8, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

Вместо этого я увидел неожиданный пробел после "123".Кто-нибудь знает, как создать пустой абзац пули с помощью BulletSpan?Спасибо!

1 Ответ

5 голосов
/ 27 ноября 2011

Я запустил твой код и понял, что ты имеешь в виду.Странный пробел после «123» выглядит как графическая ошибка, потому что на самом деле он не рассматривается как символ пробела;то есть нажмите клавишу Backspace, и вы увидите, что число «3» удаляется.

При этом, к счастью, есть простое решение вашей проблемы: вам нужно изменить индексы, к которым вы применяетепролеты.Поменяйте строки в вашем собственном коде на приведенные ниже, и вы увидите, что странное белое пространство исчезло, и появилась третья пустая пуля.Это также введет некоторый промежуток между маркером и фактическим текстом, следующим за ним.

s.setSpan(new BulletSpan(), 0, 0, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new BulletSpan(), 4, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new BulletSpan(), 8, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Лично я хотел бы сделать это немного более гибким, разбить всю строку на отдельные части и перебрать их.Используя SpannableStringBuilder, вы можете добавлять текст и устанавливать интервалы при каждой конкатенации.Под водой это уже происходит, так как во время выполнения contentET.getText() фактически возвращает SpannableStringBuilder.:)

Также обратите внимание, что я использовал Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, так как в противном случае вы внезапно увидите дополнительные маркеры, когда начнете удалять текст, возвращая его назад.

Результат будет выглядеть следующим образом:

Creating an empty BulletSpan

...