Как заменить символ `\n` в качестве новой строки в Android
У меня есть один ответ сервера на запрос API, как показано ниже.
Success! Your request has been sent.\n\nWe’ll inform you once it is done.
Это сообщение мне нужно показать в снэк-баре. Мне нужно добавить новую строку вместо \n
в этом ответе. Я пытался с помощью replaceAll
лайк
String message = (serverResponse.getMessage()).replaceAll("\\n", System.getProperty("line.separator"));
но это показывает, как это
То же сообщение, если я добавлю в string.xml
файл ресурсов и использовать getString(R.string.message)
тогда \n
работает правильно. Как я могу получить новую строку из этой строки ответа?
Я пытался изменить \n
с другим персонажем, как <new_line>
из ответа сервера, и он работает нормально с replaceAll
, Проблема только с \n
в ответном сообщении. Есть ли способ разобрать \n
?
5 ответов
Что вам нужно
String message = serverResponse.getMessage().replaceAll("\\\\n", "\n");
Зачем нужны четыре обратные косые черты?
Потому что в Java обратная косая черта \
это побег персонаж. Если вы хотите, чтобы внутри строки Java был одинарный литерал с обратной косой чертой, вы должны экранировать его и использовать \\
Но, replaceAll
Метод ожидает выражение регулярного выражения, где снова обратный слеш является escape-символом, поэтому вам также нужно его экранировать.
По сути, в приведенном выше коде анализатор строк Java сначала преобразует эти четыре обратные косые черты в два \\\\ -> \\
и затем анализатор регулярных выражений будет интерпретировать оставшиеся две обратные косые черты как один литерал обратной косой черты.
Я считаю, что вы должны быть в состоянии сделать следующее.
// Replace "\n" with "<br>"
String message = (serverResponse.getMessage()).replaceAll("\\n", "<br>");
// Now set SnackBar text using HTML
mSnackBar.setText(HTML.fromHTML(message))
Используя HTML.fromtHTML(String)
Вы должны иметь возможность сохранять любое форматирование, такое как разрывы, символы ASCII HTML (маркеры, звездочки и т. д.), раскрашивание и / или выделение жирным шрифтом / курсивом! Я использую это довольно часто для форматирования текста в TextViews, который я показывал пользователям. Не понимаю, почему это не будет работать с SnackBars!
Библиотека дизайна поддержки будет содержать только 2 строки для Snackbar
, Это соответствует максимальному размеру около 80dp.
Ваше решение должно работать, и это правильно. Попробуйте это в тосте для быстрого теста. Это будет работать, как вы ожидаете. Еще один тест, который вы можете сделать, это избавиться от одного из \n
тогда он, вероятно, будет отображаться правильно; Тем не менее, есть несколько других вариантов, которые вы можете использовать. Опять же, это всего лишь тесты. Проверьте ниже для некоторых реальных решений!
Решения
Удалить все
\n
отSnackbar
текст. Это, вероятно, лучшее решение, поскольку оно позволит вашему дизайну оставаться максимально приближенным к материалу. Настоятельно рекомендуетсяВы можете получить актуальный
TextView
отSnackbar
и измените его максимальное количество строк
View sbv = snackbar.getView(); TextView tv = (TextView) sbv.findViewById(android.support.design.R.id.snackbar_text); tv.setMaxLines(5);
- В XML вы можете изменить атрибут, который влияет на библиотеку дизайна
Snackbar
количество строк. Не рекомендуется вообще. Это имя может измениться без уведомления и сломать ваш интерфейс
<integer name="design_snackbar_text_max_lines">5</integer>
редактировать
Если у вас есть доступ для изменения содержимого ответа сервера, я настоятельно рекомендую вам изменить ответ сервера, чтобы он был более кратким для пользователя. Ваше текущее сообщение не является кратким и занимает у пользователя больше времени, чем необходимо для чтения.
Измени это на это..
Request sent! You will be informed shortly.
Я бы нашел лучшую работу для Request
если ты можешь. Например, если они заказали пиццу и отправили запрос, то вы бы сказали, Order sent! ...
, Кроме того, вам может потребоваться изменить shortly
чтобы быть более точным к тому, что может ожидать пользователь. Короче говоря, для меня это означает, что я должен ожидать что-то самое позднее в течение часа.
В любом случае, проверьте эту документацию. Настоятельно рекомендуется для написания стилей на Android. https://www.google.com/design/spec/style/writing.html Источник: Android Multiline Snackbar
Snackbar snackbar = Snackbar.make(ref_id, "Success! Your request has been sent.\n\nWe’ll inform you once it is done.",
Snackbar.LENGTH_LONG).setDuration(Snackbar.LENGTH_LONG);
View snackbarView = snackbar.getView();
TextView tv= (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
tv.setMaxLines(3);
snackbar.show();
Как насчет этого, Jrd.
strings.xml:
<string name="br">\n</string>
закусочная:
"Your request has been sent.." + getResources().getString(R.string.br)
StringBuilder strAppend = новый StringBuilder(); strAppend.append("\ п");
Строка newString = oldString.replace("\n", strAppend);
Log.d(TAG, "новый: " + newString);