Новый символ строки \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
Вы должны установить флаг перед заполнением поля.