Android: как обернуть текст символами? (Не словами)

Например:

This is foo text for wrapping text in TextView

Способ переноса TextView:

This is foo text for
wrapping text in ...

Я хочу этот:

This is foo text for wr
apping text in TextView

person Christian    schedule 25.02.2011    source источник
comment
Привет, Кристиан, я ищу точное решение, но я не могу реализовать его, используя ваш принятый ответ. пожалуйста, дайте мне знать, как это сделать в текстовом виде   -  person praveenb    schedule 20.12.2012


Ответы (5)


Это немного хакерски, но вы можете заменить пробелы символом пробела без разрыва Unicode (U + 00A0). Это приведет к тому, что ваш текст будет рассматриваться как одна строка и переноситься на символы вместо слов.

myString.replace(" ", "\u00A0");

person martinp    schedule 30.03.2011
comment
Я бы не назвал это таким хаком. Разве не для этого предназначен персонаж? Работает как шарм. - person Markus; 14.05.2013
comment
Справедливо. Я называю это хакерским решением, потому что эта функциональность действительно должна быть встроена в TextView. Эквивалент iOS, UILabel, позволяет вам установить режим разрыва строки и имеет все виды режимов переноса и усечения. - person martinp; 14.06.2013
comment
Это касается только нежелательных разрывов строк, вызванных пробелами. Приведенный ниже ответ от atarasenko действительно решает проблемы, поскольку он также заботится о нежелательных разрывах строк из-за дефисов, точек с запятой и т. д. - person j3App; 23.11.2017
comment
Предостережение: если вам нужно использовать строку позже, вам может потребоваться отменить замену. [Этот ответ помог улучшить отображение результатов в моем приложении, но поиск в базе данных с использованием getListAdapter().getItem(row).toString().substring(0, 20).trim() начал давать сбой, пока я не понял, что требуется реверс] - person RudyF; 30.01.2019

Насколько я знаю, для TextView такого свойства нет. Если вы хотите реализовать перенос текста самостоятельно, вы можете переопределить TextView и использовать breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth). Обратите внимание, что вы должны указать размер текста, шрифт и т. д. для экземпляра Paint.

person Olsavage    schedule 25.02.2011

Добавьте невидимый пробел нулевой ширины ('​') после каждого символа:

textView.setText(longlongText.replaceAll(".(?!$)", "$0\u200b"));

Это работает и для длинных строк, не содержащих пробелов (например, адреса ссылок). Стандартный TextView пытается разорвать ссылку по вопросительному знаку '?' и косая черта '/'.

person atarasenko    schedule 19.09.2017

public class CharacterWrapTextView extends TextView {
  public CharacterWrapTextView(Context context) {
    super(context);
  }

  public CharacterWrapTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public CharacterWrapTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  @Override public void setText(CharSequence text, BufferType type) {
    super.setText(text.toString().replace(" ", "\u00A0"), type);
  }
}

<com.my.CharacterWrapTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text"/>

введите описание изображения здесь

(желтый фон: обычный текст)

person Changhoon    schedule 19.10.2016

Следующий метод расширения реализует решение @atarasenko на C#, которое может быть полезно для людей, работающих с Xamarin.Android. Результирующая строка будет переноситься в TextView посимвольно.

/// <summary>
/// Add zero-width spaces after each character. This is useful when breaking text by
/// character rather than word within a TextView.
/// </summary>
/// <param name="value">String to add zero-width spaces to.</param>
/// <returns>A new string instance containing zero-width spaces.</returns>
public static string AddZeroWidthSpaces(this string value) => Regex.Replace(
    value
    , "."
    , "$0\u200b"
);
person masterwok    schedule 12.12.2018
comment
Спасибо, все еще работает в Xamarin Android и лучше, чем приведенные выше решения. - person Jacob Hatwell; 11.03.2021