Текстовое представление Android не поддерживает разрыв строки

Я программно создаю пользовательское представление, которое отображает текст, проанализированный из XML-файла. Текст длинный и содержит символ "/n" для принудительного разрыва строки. По какой-то причине в текстовом представлении отображается /n и нет разрывов строк. Вот мой код:

                    // get the first section body
                    Object body1 = tempDict.get("FIRE");
                    String fireText = body1.toString();

                    // create the section body
                    TextView fireBody = new TextView(getActivity());
                    fireBody.setTextColor(getResources().getColor(R.color.black));
                    fireBody.setText(fireText);
                    fireBody.setTextSize(14);
                    fireBody.setSingleLine(false);
                    fireBody.setMaxLines(20);
                    fireBody.setBackgroundColor(getResources().getColor(R.color.white));

                    // set the margins and add to view
                    layoutParams.setMargins(10, 0, 10, 0);
                    childView.addView(fireBody,layoutParams);

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

Now is the time /n for all good men to /n come to the aid of their /n party

Он должен отображаться как таковой;

Now is the time
for all good men to
come to the aid of their
party

Есть ли какие-то настройки, которые мне не хватает?

ОБНОВЛЕНИЕ

\r\n работает, если я жестко закодирую его в своем представлении. то есть:

String fireText = "Now is the time \r\n for all good men \r\n to come to the aid";

На самом деле \n также работает, если я жестко запрограммирую его:

String fireText = "Line one\nLine two\nLine three";

К вашему сведению

System.getProperty("line.separator");

это возвращает строку «/n», поэтому нет необходимости преобразовывать в «/r/n».

К сожалению, мои данные происходят из XML-файла, который анализируется и сохраняется в хэш-карте. Я пробовал следующее:

String fireText = body1.toString().replaceAll("\n", "\r\n");

\n не заменяется на \r\n. Может быть, это потому, что я конвертирую объект в строку?


person wyoskibum    schedule 08.07.2012    source источник
comment
Разрыв строки \n, а не /n   -  person azgolfer    schedule 08.07.2012
comment
Извините, опечатка в моей части. Исходный текст из моего XML-файла — \n.   -  person wyoskibum    schedule 08.07.2012


Ответы (7)


У меня была точно такая же проблема при точно тех же обстоятельствах. Решение довольно простое.

Если подумать, поскольку виджет textview отображает текст с буквальными значениями «\n», тогда строка, которую ему задают, должна хранить каждый «\n», например «\\n». Таким образом, когда ваша строка XML читается и сохраняется, все вхождения "\n" экранируются, чтобы сохранить этот текст как обычный текст.

В любом случае, все, что вам нужно сделать, это:

fireBody.setText(fireText.replace("\\n", "\n"));

Работает на меня!

person Rob    schedule 14.09.2012
comment
Спасибо за ответ. Это точное решение, к которому я в конце концов пришел. - person wyoskibum; 15.09.2012
comment
replaceAll() использует в качестве первого параметра регулярное выражение, replace() использует обычную строку - person Tano; 01.08.2014
comment
Я использовал replaceAll() и застрял на этом около 2 дней. вы действительно сэкономили мое время. - person jemsnaban; 23.12.2016

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

string = string.replace("\\\n", System.getProperty("line.separator"));

1) используя метод замены, вам нужно отфильтровать экранированные переводы строки (например, '\\n')

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

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

Привет :D

person Robert    schedule 29.04.2013
comment
идеально то, что мне нужно, я использую string = string.replaceAll(\\n, ‹br /›); не работает, но ваше решение работает отлично - person Muklas; 18.09.2016
comment
Странно... другие решения не работают, но это сработало для нас. - person Manan Shah; 04.10.2019

Для разрыва строки вы используете заданное текстовое представление в макете xml таким образом.

Настало время \r\n всем хорошим людям \r\n прийти на помощь своей \r\n группе.

person Md Abdul Gafur    schedule 08.07.2012
comment
Спасибо за ответ. \r\n работает, если я жестко кодирую текст. то есть: fireBody=Сейчас пора \r\n всем хорошим людям \r\n прийти на помощь своей \r\n группе. Но мой текст исходит из файла XML, который я анализирую в хэш-карту, и \н. Я пробовал: String fireText = body1.toString().replaceAll(\n, \r\n); Но мое текстовое представление по-прежнему отображает текст с отображением \r\n и без разрывов строк. - person wyoskibum; 08.07.2012
comment
Также вы можете добавить ‹br› вместо \n. Затем вы можете добавить текст в TexView: articleTextView.setText(Html.fromHtml(textForTextView)); - person Md Abdul Gafur; 09.07.2012

У меня также была эта проблема, и я нашел действительно ПРОСТОЕ РЕШЕНИЕ, если установил текст из ресурсов XML (я знаю, что это не то же самое, что OP, но это стоит знать)

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

<string name="test_string">"1. First
2. Second Line
3. Third Line"</string>
person Corbella    schedule 27.06.2014
comment
Для того, кто проголосовал за этот ответ .... Я предлагаю вам сначала попробовать ответ ... Очевидно, что вы этого не сделали, поскольку он работает отлично! - person Corbella; 09.07.2014
comment
Действительно работает! Пробовал ‹br›, \n, \r\n, но безрезультатно. Это был единственный способ заставить его работать! Парню, который проголосовал за этот ответ, должно быть стыдно за себя! - person Borzh; 02.04.2015
comment
Ничего себе... У меня сработало только это, самое простое из решений. - person ask-dev; 09.04.2015
comment
Но когда я добавляю этот тип текста с вводом в базу данных, он не работает. вы не могли бы мне помочь? @Корбелла - person Chirag Patel; 01.08.2016
comment
Это не гарантирует работу на всех устройствах. На некоторых устройствах разделитель новой строки по-прежнему будет отображаться как искаженный символ. Но похоже, что это работает в редакторе макетов. - person Yuri Brigance; 06.10.2017

попробуй это

fireBody.setText(Html.fromHtml("testing<br>line<\br>") 

ваш сервер должен отправить FirstLine<br>lineAfterLineBreak<\br>

person Mohsin Naeem    schedule 08.07.2012
comment
Спасибо за ответ. Мои данные берутся из XML-файла, который я разбираю, и было бы сложно переформатировать его для HTML. - person wyoskibum; 08.07.2012

Чтобы заставить разрыв строки XML вашего текстового представления, вам нужно использовать \r\n вместо просто \n.

Итак, теперь ваш код в XML становится

android:text="Now is the time \r\n for all good men to \r\n come to the aid of their \r\n party"

Или, если вы хотите сделать это программно, то в вашем java-коде:

fireBody.setText("Now is the time \r\n for all good men to \r\n come to the aid of their \r\n party");

Вы также можете объявить текст как строковое значение ресурса, например:

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

Другой простой способ сделать это - изменить атрибут TextView по умолчанию в вашем XML-файле.

<TextView
    android:id="@+id/tvContent"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:singleLine="false"

/>

А затем используйте textView.setText("First line \nSecond line \nThird line");

person Swayam    schedule 08.07.2012
comment
Спасибо за ответ. Я попытался заменить \n на \r\n, используя: String fireText = body1.toString().replaceAll(\n, \r\n); но символы не заменяются. - person wyoskibum; 08.07.2012
comment
Ну, что насчет этого? Поместите текст, который вы хотите отобразить, в качестве строкового значения ресурса. - person Swayam; 08.07.2012
comment
‹string name=sample_string›‹![CDATA[какая-то тестовая строка 1 ‹br /›какая-то тестовая строка 2]]›‹/string› - person Swayam; 08.07.2012
comment
Если вы не хотите использовать формат HTML, проверьте код в моем отредактированном ответе. - person Swayam; 08.07.2012
comment
Еще раз спасибо за помощь. Текст, который мне нужно отобразить, хранится в XML-файле, который я анализирую в виде хэш-карты и извлекаю с помощью ‹k,v›. У меня около 80 записей, и у каждой есть подмножество из 9-12 полей для отображения. Я создаю текстовое представление программно, поскольку данные варьируются от одной записи к другой. Если вы посмотрите на мой исходный пост, я устанавливаю для singleLine значение false. Я предполагаю, что проблема связана с тем, как я анализирую файл XML и сохраняю его в хэш-карте. - person wyoskibum; 08.07.2012
comment
Простите меня за мое невежество, но я, кажется, полностью упустил из виду атрибут singleLine в вашем коде. Что ж, если это все еще не работает, то я думаю, что может быть какая-то другая проблема, может быть, что-то идет не так при разборе, как вы уже упоминали. Я предлагаю вам опубликовать код, относящийся к синтаксическому анализу, на SO и посмотреть, правильный он или нет. - person Swayam; 08.07.2012
comment
Ну, это может звучать очень глупо, но пробовали ли вы запускать свою программу на любом эмуляторе или устройстве? Я имею в виду, что бывают случаи, когда визуальный редактор не отображает вещи должным образом, но все правильно отображается в эмуляторе/устройстве. - person Swayam; 08.07.2012
comment
Нет, это не глупо. Я пробовал это как на эмуляторе vanilla 4.0, так и на моем устройстве 2.3.3, и я получаю те же результаты. Я думаю, что может быть ошибка при преобразовании из объекта в toString. Я посмотрю, смогу ли я сократить код синтаксического анализа до разумной длины и опубликую его. - person wyoskibum; 08.07.2012

Я просто использую это, и теперь оно отлично работает для меня.

 message =message.replace("\n","\r\\n");
person Mansoor    schedule 20.10.2020