Новый символ строки \n не отображается правильно в текстовом приложении Android

Я знаю, что если вы сделаете что-то вроде

myTextView.setText("This is on first line \n This is on second line");

Затем он будет отображаться правильно следующим образом:

Это первая строка
Это вторая строка

Когда я храню эту строку в базе данных и затем устанавливаю ее в представление, она отображается как таковая:

Это первая строка \n Это вторая строка

Вот строка кода, которую я использую для извлечения строки из базы данных:

factView.setText(factsCursor.getString(MyDBAdapter.FACT_COLUMN));

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

Есть ли причина, что он не отображает символы \n правильно? Это должно быть связано с тем, что строка находится в базе данных. Любые предложения?

Ответы

Ответ 1

Как сказал Фальмарри в своем комментарии, ваша строка сбрасывается, когда она помещается в базу данных. Вы можете попробовать и удалить строку, вызвав String s = unescape(stringFromDatabase), прежде чем поместить ее в свой TextView.

В качестве примечания, убедитесь, что вы используете DatabaseUtils.sqlEscapeString() для любых данных, которые принадлежат пользователю или неизвестному сменному источнику при вставке данных в базу данных. Это защитит вас от ошибок и SQL Injection.

Ответ 2

Я нашел этот вопрос. Ответ Остин Махоуни верен, но вот небольшая помощь:

   private String unescape(String description) {
    return description.replaceAll("\\\\n", "\\\n");
}

description является строкой, выходящей из вашей базы данных SQLite

Ответ 3

Попробуйте \\n вместо \n. Если он выдает исключение, чем использовать ключевое слово newline вместо \n.... newline - это один символ, ascii 10; он часто вводится в строковый литерал... и будет служить вашей цели....:)

Ответ 4

"This is on first line"||x'0A'||"This is on second line"

|| объединяет строки, а x'0A' - незастроенная строка новой строки.

Если вы вставляете записи, вам нужно будет заменить каждую новую строку на "||x'0A'||" (если ваша строка двойным кавычками). Это может показаться неуклюжим по сравнению с другими. Однако, если ваши строки находятся в отдельных столбцах, это также работает при выборе:

SELECT firstline||x'0A'||secondline FROM wherever;

Я нашел это, имея ту же проблему: http://www.mail-archive.com/[email protected]/msg43557.html

Ответ 5

Текстовая область может быть в многострочном или однострочном режиме. Когда он находится в режиме одиночной строки, символы новой строки '\n' будут рассматриваться как пробелы. Если вы сомневаетесь, чтобы переключить многолинейный режим, вы можете использовать следующий код:

    setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_MULTI_LINE);

У меня возникла проблема с тем, что тот же код не работал на сотах и ​​на froyo, которые, похоже, имеют разные значения по умолчанию. Я теперь также исключаю флаг, когда хочу заставить поле быть однострочным.

Из документа Android:

public static final int TYPE_TEXT_FLAG_MULTI_LINE Добавлен в уровень API 3

Флаг для TYPE_CLASS_TEXT: несколько строк текста могут быть введены в поле. Если этот флаг не установлен, текстовое поле будет ограничивается одной строкой. Постоянное значение: 131072 (0x00020000)

http://developer.android.com/reference/android/text/InputType.html#TYPE_TEXT_FLAG_MULTI_LINE

Вы должны установить флаг перед заполнением поля.