Изменение поведения переноса строки

Я могу использовать Spannable в TextViews для создания промежутков с различными внешними, подчеркивающими, зачеркиваниями и т.д. Как я могу сделать то же самое, чтобы изменить поведение переноса строк? В частности, я не хочу, чтобы адрес электронной почты был закрыт посередине, я хочу, чтобы он действовал как одно слово.

Я попробовал WrapTogetherSpan, но я не мог заставить его работать. Похоже, что он используется только DynamicLayout, и я не мог заставить TextView использовать DynamicLayout.

<TextView
  android:id="@+id/merchant_email_field"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:textSize="@dimen/account_setting_email"
  android:gravity="center"
  android:bufferType="spannable"
  android:maxLines="2"
  android:ellipsize="end"
  />

Как я устанавливаю spannable:

WrapTogetherSpan TOGETHER_SPAN = new WrapTogetherSpan() {};
String collectedString = getString(R.string.email_sentence, userEmail);
int emailOffset = collectedString.indexOf(userEmail);
Spannable emailSpannable = Spannable.Factory.getInstance()
    .newSpannable(collectedString);
emailSpannable.setSpan(TOGETHER_SPAN, emailOffset,
    emailOffset + userEmail.length(),
    Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(emailSpannable)

Ответ 1

Не знаю, нашли ли вы ответ на него, но вы можете использовать unicode, чтобы помочь вам.

есть символ пробела без пробела, поэтому вам нужно будет заменить все пробелы, которые вы хотите разбить с помощью этого символа (\ u00A0)

для примера

String text = "Hello World";
text.replace(' ', '\u00A0');
textView.setText(text);

Кстати, я искал решение для диапазона и не мог найти его, WrapTogetherSpan - это просто интерфейс, чтобы он не работал...

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

Ответ 2

Если вы выполняете более низкоуровневое решение (т.е. самостоятельно рисуете собственный текст и обрабатываете линейную упаковку), см. BreakIterator. Метод BreakIterator.getLineInstance() factory обрабатывает адреса электронной почты как единое целое.

String text = "My email is [email protected]";
BreakIterator boundary = BreakIterator.getLineInstance();
boundary.setText(text);
int start = boundary.first();
for (int end = boundary.next(); end != BreakIterator.DONE; end = boundary.next()) {
    System.out.println(start + " " + text.substring(start, end));
    start = end;
}

На выходе показаны индексы начала начала границы, где допустимы разрывы строк.

0 My 
3 email 
9 is 
12 [email protected]

См. также

Ответ 3

Вы пытались добавить android:singleLine="true" в свой XML?