Как добавить разрыв строки в Android TextView?

157

Я пытаюсь добавить разрыв строки в TextView.

Я пытался предложить \ n, но это ничего не значит. Вот как я устанавливаю свои тексты.

TextView txtSubTitle = (TextView)findViewById(r.id.txtSubTitle);
txtSubTitle.setText(Html.fromHtml(getResources().getString(R.string.sample_string)));

Это моя строка: <string name="sample_string">some test line 1 \n some test line 2</string>

Это должно показать так:

some test line 1
some test line 2

Но это показывает , как так: some test line 1 some test line 2.

Я что-то упускаю?

dropsOfJupiter
источник
Вы установили Android: линии по крайней мере 2?
Робби Понд
мои субтитры получают до 6-9 строк, и они переносят текст на следующую строку, но если я хочу разбить его, он не прерывается.
DropOfJupiter
Вы должны опубликовать свое решение в качестве ответа и принять его, чтобы люди могли проголосовать!
большие камни
1
Я создал небольшой пример проекта, чтобы проиллюстрировать различные способы кодирования разрывов строк и их побочные эффекты. Спойлер: \nэто действительно лучший способ. github.com/paour/StringResourceTest
Пьер-Люк Паур
Почему за этот вопрос так проголосовали? Вы смотрели это вообще? Решение очень простое, просто удалите эту Html.fromHtml()функцию и просто используйте txtSubTitle.setText(getResources().getString(R.string.sample_string)).
Ошибки происходят

Ответы:

222

\n у меня работает, вот так:

<TextView android:text="First line\nNext line"
ронн
источник
87
Только \nодин будет работать ... Не думай, что \rон что- то делает.
Питер Айтай
5
\ r \ n это разрыв строки для windows, а \ n - разрыв строки для linux
Гильерме Торрес Кастро
это не работает для меня 2 ABC "/>
AndroidRaji
1
Вводит в заблуждение, что вы не упомянули о другом внесенном вами изменении, которое добавляло кавычки вокруг строки
Патрик
2
«\ r» фактически отображается как «r» в тексте. Так что, как и предполагали другие, '\ n' делает свое дело.
Миха Маркич
93

ок разобрался

<string name="sample_string"><![CDATA[some test line 1 <br />some test line 2]]></string>

так что обтекание в CDATA необходимо и разрывы добавляются внутрь как HTML-теги

dropsOfJupiter
источник
3
Используйте это в строковом ресурсе & # xa; Как "Привет! Первая строка! & # Xa; Это вторая строка"
RexSplode
3
Это требует использования Html.fromHtml(), что немного для простого перевода строки и не очень хорошо поддерживается поставщиками переводов.
Пьер-Люк Паур
Давай, чувак, серьезно? Вы не могли найти проблему в своем вопросе?
Ошибки происходят
68

Версия Android 1.6 не распознает \ r \ n. Вместо этого используйте: System.getProperty ("line.separator")

String s = "Line 1"
           + System.getProperty ("line.separator")
           + "Line 2"
           + System.getProperty ("line.separator");
Эрик ЖОЙЕ
источник
3
Upvote! Это сработало для меня! Если вы просто хотите добавить разрыв строки в форме: textView.setText (string1 + System.getProperty ("line.separator") + string2); тогда это работает удовольствие, спасибо!
Дважды обведено
WAT? Есть ли версия Android под управлением Windows?
Maaartinus
3
Для тех, кто использует Xamarin, это эквивалентно: Java.Lang.JavaSystem.LineSeparator ()
Стив
1
Почему не просто System.lineSeparator ()?
Джордж З.
60

Разрыв строки (\ n) работает только в том случае, если вы указали значение строкового ресурса в кавычках:

<string name="sample_string">"some test line 1 \n some test line 2"</string>

Это не будет делать разрывы строк, если вы поставите его без кавычек, как это:

<string name="sample_string">some test line 1 \n some test line 2</string>

да, это так просто

datayeah
источник
3
я просто хотел добавить, что этот материал для цитат также прекрасно работает со специальными символами в строковых ресурсах или с такими языками, как греческий или русский ... (если у вас возникнут какие-либо проблемы)
datayeah
1
Спасибо, я думаю, что использование кавычек - лучшее решение для поддержания читабельности длинных многострочных текстов <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink
1
Использование кавычек имеет и другие побочные эффекты, например, делает пробелы всегда значимыми (без кавычек несколько пробелов в строке, таких как отступы, свернуты).
Пьер-Люк Паур
33

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

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. Используя метод замены, вам нужно отфильтровать экранированные переводы строк (например, '\\ n')

  2. Только тогда каждый экземпляр escape-символа перевода строки '\ n' будет преобразован в фактический перевод строки.

Для этого примера я использовал базу данных Служб Google Scripting noSQL (ScriptDb) с данными в формате JSON.

Ура: D

Роберт
источник
text.replace ("\\ n", System.getProperty ("line.separator"))
Мусса
18

Это сработало для меня

android:text="First \n Second"
Aniruddha
источник
2
Ваш пример выглядит так, как будто он включает в себя текст в ресурсе макета, который является большим нет-нет (невозможно локализовать).
Пьер-Люк Паур
17

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

1) символ новой строки \n

<string name="sample> This\nis a sample</string>

2) HTML-тег новой строки <br>или<br />

<string name="sample> This<br>is a sample</string>
poitroae
источник
6
Я не отрицал это, но думаю, что ваш код неправильный, вам нужно "& lt; br>" вместо "<br>", он не будет работать, так как <является зарезервированным символом.
JPM
<br>, <u>, <b>И <i>теги разрешены в строковых ресурсах без побега, и правильно применяются TextView.setText(resId). Они удаляются при использовании Context.getString(resId), если не обернуты в CDATAраздел.
Пьер-Люк Паур
16

Это сработало для меня, может быть, кто-то найдет это полезным:

TextView textField = (TextView) findViewById(R.id.textview1);
textField.setText("First line of text" + System.getProperty("line.separator") + "Linija 2");
Желько Иванович
источник
11

Если вы используете XML для объявления вашего использования TextView android:singleLine = "false"или в Java, используйтеtxtSubTitle.setSingleLine(false);

странный кварк
источник
нет, это не сработало. Имеет ли это какое-либо отношение к Html.fromHtml () и строковым ресурсам?
падает
@dropsOfJupiter: вы смотрели на то, что возвращает вызов Html.fromHtml ()? Мне было бы любопытно присвоить его строке и посмотреть на него в отладчике.
slund
10

Используется Android Studio 0.8.9. Единственный способ, сработавший для меня, это использование \n. Ни упаковка с CDATA, ни <br>или не <br />работали.

Максим Березовский
источник
8

Я использую следующее:

YOUR_TEXTVIEW.setText("Got some text \n another line");
Карло Матулесси
источник
8

очень просто: используйте "\ n"

    String aString1 = "abcd";
    String aString2 = "1234";
    mSomeTextView.setText(aString1 + "\n" + aString2);

\ n соответствует ASCII char 0xA, который является 'LF' или переводом строки

\ r соответствует ASCII char 0xD, который является 'CR' или переводом каретки

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

в Android / java \ n соответствует возврату каретки + перевод строки, так как в противном случае вы просто «перезаписали бы» ту же строку

Ронни Веберс
источник
6

Попробуйте перепроверить ваши локализации. Возможно, вы пытаетесь редактировать один файл (локализация), но на самом деле программа использует другой, как в моем случае . Системный язык по умолчанию русский, а я пытаюсь редактировать английскую локализацию.

В моем случае, рабочим решением является использование "\ n" в качестве разделителя строк:

    <string name="string_one">line one.
    \nline two;
    \nline three.</string>
Доктор фаилов
источник
4

Также вы можете добавить "&lt;br&#47;&gt;"вместо \ n.

Это HTML экранированный код для <br/>

И тогда вы можете добавить текст в TexView:

articleTextView.setText(Html.fromHtml(textForTextView));
мобилдев алекс
источник
Неа, не думай так. Android на самом деле напечатать эту ерунду. Я попытался. Это хорошо работает в HTML, но не здесь, особенно когда вы выполняете Html.fromHTML («моя строка из файла XML»)
dropOfJupiter
@drops - не забудьте toString ==> Html.fromHtml(textForTextView).toString() --- И тогда вы можете сделать: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- Другими словами, просто используйте <br/>непосредственно внутриfromHtml()
Питер Айтай
&lt;br/>должно быть достаточно, чтобы информация о стиле не удалялась. (на основании официальной документации)
jpmcosta
3

Вы также можете использовать String-Editor в Android Studio, он автоматически генерирует линейные тормоза и тому подобное ...

Тим
источник
2

Как Html.fromHtmlустаревший, я просто использовал этот код, чтобы получить String2 в следующей строке.

textView.setText(fromHtml("String1 <br/> String2"));

,

@SuppressWarnings("deprecation")
    public static Spanned fromHtml(String html){
        Spanned result;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
        } else {
            result = Html.fromHtml(html);
        }
        return result;
    }
Шилендра Мадда
источник
2

Самый простой способ сделать это - перейти к значениям / строкам (в папке ресурсов)

Объявите строку там:

    <string name="example_string">Line 1\Line2\Line n</string>

И в вашем конкретном XML-файле просто вызовите строку как

    <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_string" />
Фидан Гилл
источник
1

Я нашел другой метод: необходимо добавить атрибут " android: maxWidth =" 40dp " ". Конечно, это может не работать идеально, но это дает разрыв строки.

Мастер
источник
1

\ n не работал для меня. Я смог решить проблему, изменив xml на text и создав текстовое свойство textview, как показано ниже.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Надеюсь, это поможет тем, кто сказал, что \ n не работает для них.

Джош Греко
источник
Я не уверен, что это хорошее решение. Там просто скрытые \nперсонажи.
Almo
1

Я читаю свой текст из файла, поэтому я выбрал немного другой подход, так как добавление \ n к файлу привело к появлению \ n в тексте.

    final TextView textView = (TextView) findViewById(R.id.warm_up_view);
    StringBuilder sb = new StringBuilder();
    Scanner scanner = new Scanner(getResources().openRawResource(R.raw.warm_up_file));
    while (scanner.hasNextLine()) {
      sb.append(scanner.nextLine());
      sb.append("\n");
    }

    textView.setText(sb.toString());
Рич Фогт
источник
0

Может быть, вы можете вставить lf в текст, но он не отображается? Убедитесь, что у вас достаточно высоты для контроля. Например:

Верный:

android:layout_height="wrap_content"

Может быть не прав

android:layout_height="10dp"
Jarekczek
источник
0

В моем случае я решил эту проблему, добавив следующее:

android:inputType="textMultiLine"
Эльсио Цестари
источник
Тип ввода для EditText, а не TextView
clauziere
0

попробуй это:

         TextView calloutContent = new TextView(getApplicationContext());
         calloutContent.setTextColor(Color.BLACK);
         calloutContent.setSingleLine(false);
         calloutContent.setLines(2);
         calloutContent.setText(" line 1" + System.getProperty ("line.separator")+"  line2" );
Бахман Рашиди
источник
0

Я чувствую, что необходим более полный ответ, чтобы описать, как это работает более тщательно.

Во-первых, если вам нужно расширенное форматирование, посмотрите руководство по использованию HTML в строковых ресурсах .
Затем вы можете использовать <br/>и т. Д. Однако, это требует установки текста с помощью кода.

Если это простой текст, есть много способов избежать символа новой строки (LF) в статических строковых ресурсах .

Заключение строки в двойные кавычки

Самый чистый способ - заключить строку в двойные кавычки.
Это сделает так, что пробел интерпретируется точно так, как он выглядит, а не свернут.
Тогда вы можете просто использовать символ новой строки в этом методе (не используйте отступы).

<string name="str1">"Line 1.
Line 2.
Line 3."</string>

Обратите внимание, что некоторые символы требуют специального экранирования в этом режиме (например, \").

Экранирующие последовательности ниже также работают в режиме кавычек.

При использовании одной строки в XML для представления многострочных строк

Самый элегантный способ избежать перехода на новую строку в XML - это использовать его кодовую точку (10 или 0xA в шестнадцатеричном формате), используя его сущность XML / HTML &#xA;или &#10;. Это способ XML избежать любого символа .
Однако, похоже, это работает только в режиме кавычек.

Другой способ - просто использовать \n, хотя, по моему мнению, это негативно влияет на удобочитаемость (поскольку это не специальная escape-последовательность в XML, Android Studio не выделяет ее).

<string name="str1">"Line 1.&#xA;Line 2.&#10;Line 3."</string>
<string name="str1">"Line 1.\nLine 2.\nLine 3."</string>
<string name="str1">Line 1.\nLine 2.\nLine 3.</string>

Не включайте новую строку или любые пробелы после любой из этих escape-последовательностей, так как это будет интерпретироваться как дополнительное пространство.

geekley
источник
-1

Используйте разрыв текста следующим образом (\ n):

<string name="sample_string"><![CDATA[some test line 1 \n some test line 2]]></string>
Ashnet
источник