Как заменить символ `\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);

Другие вопросы по тегам