ФОРМАТ HTML.fromHtml переносы строк исчезают
Я беру охватываемый текст из окна EditText и преобразую его в строку с тегами HTML с помощью HTML.toHtml. Это прекрасно работает. Я проверил, что строка верна и содержит <br>
в соответствующем месте. Однако, когда я получил преобразовать помеченную строку обратно в растянутый текст для заполнения TextView или EditText с помощью HTML.fromHtml в <br>
(или несколько, если они присутствуют) в конце первого абзаца исчезают. Это означает, что если пользователь ввел текст с несколькими разрывами строк и хотел сохранить это форматирование, оно теряется.
Я приложил изображение, чтобы проиллюстрировать это. Первый EditText-это пользовательский ввод, TextView ниже-HTML.tohtml результат EditText выше него, EditText ниже него заполняется с помощью HTML.fromHtml, используя строку в TextView над ней. Как вы можете видеть, разрывы линий исчезли, а также дополнительные линии. Кроме того, при запуске развернутого текста второго текста редактирования через HTML.toHtml теперь создает другую строку с тегами HTML.
Я хотел бы иметь возможность взять строку с тегами HTML из первого EditText и заполнить другие TextViews или EditTexts без потери разрывов строк и форматирования.
спасибо
3 ответов
у меня также была эта проблема, и я не мог найти простое "преобразование" или что-то подобное решение. Обратите внимание на что-то важное, когда пользователь нажимает "enter" java создает специальный символ \n
но в HTML нет такого формата для разрыва линии. Это <br />
.
Так что я сделал, чтобы заменить некоторые конкретные CharSequence
s, из обычного текста, альтернативным форматом 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