ФОРМАТ HTML.fromHtml переносы строк исчезают

Я беру охватываемый текст из окна EditText и преобразую его в строку с тегами HTML с помощью HTML.toHtml. Это прекрасно работает. Я проверил, что строка верна и содержит <br> в соответствующем месте. Однако, когда я получил преобразовать помеченную строку обратно в растянутый текст для заполнения TextView или EditText с помощью HTML.fromHtml в <br> (или несколько, если они присутствуют) в конце первого абзаца исчезают. Это означает, что если пользователь ввел текст с несколькими разрывами строк и хотел сохранить это форматирование, оно теряется.

Я приложил изображение, чтобы проиллюстрировать это. Первый EditText-это пользовательский ввод, TextView ниже-HTML.tohtml результат EditText выше него, EditText ниже него заполняется с помощью HTML.fromHtml, используя строку в TextView над ней. Как вы можете видеть, разрывы линий исчезли, а также дополнительные линии. Кроме того, при запуске развернутого текста второго текста редактирования через HTML.toHtml теперь создает другую строку с тегами HTML.

enter image description here

Я хотел бы иметь возможность взять строку с тегами HTML из первого EditText и заполнить другие TextViews или EditTexts без потери разрывов строк и форматирования.

спасибо

3 ответов


у меня также была эта проблема, и я не мог найти простое "преобразование" или что-то подобное решение. Обратите внимание на что-то важное, когда пользователь нажимает "enter" java создает специальный символ \n но в HTML нет такого формата для разрыва линии. Это <br />.

Так что я сделал, чтобы заменить некоторые конкретные CharSequences, из обычного текста, альтернативным форматом HTML. В моем случае был только символ "enter", поэтому он не был таким грязным.


у меня была аналогичная проблема, когда я пытался сохранить/восстановить содержимое editText в db. Проблема в Html.toHtml, он как-то пропускает линейные тормоза:

    String src = "<p dir=\"ltr\">First line</p><p dir=\"ltr\">Second<br/><br/><br/></p><p dir=\"ltr\">Third</p>";
    EditText editText = new EditText(getContext());
    // All line brakes are correct after this
    editText.setText(new SpannedString(Html.fromHtml(src))); 
    String result = Html.toHtml(editText.getText()); // Here breaks are lost
    // Output :<p dir="ltr">First line</p><p dir="ltr">Second<br></p><p dir="ltr">Third</p>

я решил это, используя пользовательскую функцию toHtml для сериализации охватываемого текста и заменил все '\n ' на " :

    public class HtmlParser {
        public static String toHtml(Spannable text) {
            final SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text);
            int start, end;

            // Replace Style spans with <b></b> or <i></i>
            StyleSpan[] styleSpans = ssBuilder.getSpans(0, text.length(), StyleSpan.class);
            for (int i = styleSpans.length - 1; i >= 0; i--) {
                StyleSpan span = styleSpans[i];
                start = ssBuilder.getSpanStart(span);
                end = ssBuilder.getSpanEnd(span);
                ssBuilder.removeSpan(span);
                if (span.getStyle() == Typeface.BOLD) {
                    ssBuilder.insert(start, "<b>");
                    ssBuilder.insert(end + 3, "</b>");
                } else if (span.getStyle() == Typeface.ITALIC) {
                    ssBuilder.insert(start, "<i>");
                    ssBuilder.insert(end + 3, "</i>");
                }
            }

            // Replace underline spans with <u></u>
            UnderlineSpan[] underSpans = ssBuilder.getSpans(0, ssBuilder.length(), UnderlineSpan.class);
            for (int i = underSpans.length - 1; i >= 0; i--) {
                UnderlineSpan span = underSpans[i];
                start = ssBuilder.getSpanStart(span);
                end = ssBuilder.getSpanEnd(span);
                ssBuilder.removeSpan(span);
                ssBuilder.insert(start, "<u>");
                ssBuilder.insert(end + 3, "</u>");
            }
            replace(ssBuilder, '\n', "<br/>");

            return ssBuilder.toString();
        }

        private static void replace(SpannableStringBuilder b, char oldChar, String newStr) {
            for (int i = b.length() - 1; i >= 0; i--) {
                if (b.charAt(i) == oldChar) {
                    b.replace(i, i + 1, newStr);
                }
            }
        }
}

также оказалось, что этот способ быстрее примерно в 4 раза, чем Html по умолчанию.toHtml (): я сделал тест примерно с 20 страницами и 200 пядями:

    Editable ed = editText.getText(); // Here is a Tao Te Ching :)
    String result = "";
    DebugHelper.startMeasure("Custom");
    for (int i = 0; i < 10; i++) {
        result = HtmlParserHelper.toHtml(ed);
    }
    DebugHelper.stopMeasure("Custom"); // 19 ms

    DebugHelper.startMeasure("Def");
    for (int i = 0; i < 10; i++) {
        result = Html.toHtml(ed);
    }
    DebugHelper.stopMeasure("Def"); // 85 ms

заменить /n =>

пример

привет j

в:

привет j