7

Я использую то же название с this question, потому что я думаю, что мой вопрос очень похож на этот, я очень внимательно прочитал и протестировал принятый ответ, однако принятый ответ не работает для меня. Позвольте мне описать мой вопрос:Android EditText: Как создать пустую абзацу пули BulletSpan?

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

EditText myEdit = (EditText) this.findViewById(R.id.myedit); 
myEdit.setText("a\nb\n"); 
Spannable s = myEdit.getText(); 
s.setSpan(new BulletSpan(30), 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
s.setSpan(new BulletSpan(30), 2, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
s.setSpan(new BulletSpan(30), 4, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
myEdit.setText(s); 

То, что я хочу видеть это:

  • б
  • [Я хочу видеть 3-я пуля здесь, но она не отображается]

Я пробовал Spannable.SPAN_INCLUSIVE_INCLUSIVE, Spannable.SPAN_INCLUSIVE_EXCLUSIVE, Spannable.SPAN_EXCLUSIVE_INCLUSIVE, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, но ни один из этих флагов не работает для меня.

И если я использую эти коды:

EditText myEdit = (EditText) this.findViewById(R.id.myedit); 
myEdit.setText("a\nb\nc"); 
Spannable s = myEdit.getText(); 
s.setSpan(new BulletSpan(30), 0, 1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
s.setSpan(new BulletSpan(30), 2, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
s.setSpan(new BulletSpan(30), 4, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
myEdit.setText(s); 

Тогда я получить ожидаемый результат:

  • в
  • б
  • гр

Я работаю на богатый текстовый редактор, когда пользователь нажимает значок пули, я ed, чтобы показать пустую пулю, но теперь я не уверен, в чем проблема, поскольку я хочу создать новый пустой BulletSpan (только с точкой, но без символов после него), но если в промежутке нет символов начало и конец, точка не отображается.

+0

Я в настоящее время проект о богатом текстовом редакторе на Android: https://github.com/chinalwb/are, вы можете обратиться к тому, если вам нужно. –

ответ

9

Это уродливое решение, но я не нашел ничего лучше - попробуйте добавить пустой символ в конце (что-то вроде пространства нулевой ширины). Это производит результат, который вы хотели бы (по крайней мере визуально):

public void setBulletText(EditText myEdit, String text) { 
     String[] lines = TextUtils.split(text, "\n"); 
     SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); 
     String line = null; 
     for (int index = 0; index < lines.length; ++index) { 
      line = lines[index]; 
      int length = spannableStringBuilder.length(); 
      spannableStringBuilder.append(line); 
      if (index != lines.length - 1) { 
       spannableStringBuilder.append("\n"); 
      } else if (TextUtils.isEmpty(line)) { 
       spannableStringBuilder.append("\u200B"); 
      } 
      spannableStringBuilder.setSpan(new BulletSpan(30), length, length + 1, 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
     } 
     myEdit.setText(spannableStringBuilder); 
    } 

Результат является: enter image description here

В идеале я хотел бы сделать пользовательский EditText класс, который присоединяет этот символ внутренне, но удаляет его когда текст отправляется на любой другой объект.

+1

Хммм ... да, я могу представить, что в подклассе есть 'getRawText()', который возвращает 'super.getText()' (и оставляет пространство нулевой ширины), а затем переопределяет 'getText()' сам, чтобы удалить это персонаж.Я рассмотрел и отклонил эту основную идею, но я не думал о пространстве нулевой ширины, поскольку я думал о добавлении фактических пробелов. Пространство нулевой ширины делает его более приемлемым. У вас возникли проблемы с шрифтами, не соблюдающими этот символ Unicode? Большое спасибо! – CommonsWare

+0

Не заметили никаких проблем, но я тоже не очень много тестировал. На самом деле я не большой поклонник этого решения - пока еще ничего не нашел. :/ –

+0

У меня не было возможности проверить эти ответы, и не будет до истечения льготного периода щедрости. Все три включают в себя что-то на линии для последней пули. Из трех эта (ИМХО) является наименее вероятной для создания визуальных артефактов, поэтому она получает щедрость. Это было сказано, поскольку я еще не пробовал ни одного из них, YMMV. – CommonsWare

1

У меня есть простое решение этой проблемы, просто добавьте пробел в конце новой строки

EditText myEdit = (EditText) this.findViewById(R.id.myedit); 
myEdit.setText("a\nb\n "); //notice the space after newline 
Spannable s = myEdit.getText(); 
s.setSpan(new BulletSpan(30), 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
s.setSpan(new BulletSpan(30), 2, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
s.setSpan(new BulletSpan(30), 4, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
myEdit.setText(s); 
+0

Это в основном то же самое, что и ответ Самуила, за исключением того, что у него меньше визуального воздействия. Учитывая, как пользователь нажимает на «EditText», ваше пространство будет на самом деле заметным (например, пользователь нажимает и завершается в конце этой последней пули, в результате чего появляется ведущее пространство). Спасибо хоть! – CommonsWare

+0

Я пробовал код, и пространство не заметно и даже если вы нажмете на пользователя в нужном месте. – blganesh101

+0

ОК, я проведу несколько тестов. Благодаря! – CommonsWare

2

Является ли это хорошо?

EditText myEdit = (EditText) this.findViewById(R.id.myedit); 
myEdit.setText("a\nb\n\n"); 
Spannable s = myEdit.getText(); 
s.setSpan(new BulletSpan(30), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
s.setSpan(new BulletSpan(30), 2, 3, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
s.setSpan(new BulletSpan(30), 4, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
myEdit.setText(s); 
myEdit.setSelection(s.length()-1); 

В результате

enter image description here

+0

Если это зависит от вызова 'setSelection()', это нехорошо, поскольку эффект может быть потерян, если пользователь щелкнет где-нибудь. – CommonsWare

+0

, поскольку мы устанавливаем текст программно, без setSelection() курсор будет находиться непосредственно перед 'a'. Но в остальном все 3 пули появляются, как указано выше. – krishnakumarp

+0

вы можете использовать метод setTextKeepState() –

 Смежные вопросы

  • Нет связанных вопросов^_^