11

EditTextボックスからスパンテキストを取得し、HTML.toHtmlを使用してHTMLタグ付き文字列に変換しています。これは正常に機能します。文字列が正しく<br>、適切な場所にが含まれていることを確認しました。ただし、タグ付けされた文字列をスパンテキストに変換して戻し、HTML.fromHtmlを使用してTextViewまたはEditTextにデータを入力する<br>と、最初の段落の最後にある(または複数ある場合は複数の)が消えます。これは、ユーザーが複数の改行を含むテキストを入力し、そのフォーマットを維持したい場合、テキストが失われることを意味します。

これを説明するために写真を添付し​​ました。最初のEditTextはユーザー入力であり、その下のTextViewはその上のEditTextのHTML.tohtml結果であり、その下のEditTextは、その上のTextViewの文字列を使用してHTML.fromHtmlを使用して入力されます。ご覧のとおり、改行が消えたので、余分な線も消えました。さらに、2番目の編集テキストのスパンテキストがHTML.toHtmlを介して実行されると、別のHTMLタグ付き文字列が生成されるようになりました。

ここに画像の説明を入力してください

最初のEditTextからHTMLタグ付きの文字列を取得し、改行や書式設定を失うことなく、他のTextViewまたはEditTextにデータを入力できるようにしたいと思います。

4

3 に答える 3

11

私もこの問題を抱えていて、簡単な「変換」などの解決策を見つけることができませんでした。ユーザーが「Enter」キーを押すと、Javaは特殊文字を生成\nしますが、HTMLには、改行のためのそのような形式がないことに注意してください。です<br />

だから私がやったことはCharSequence、プレーンテキストからのいくつかの特定のを代替のHTML形式に置き換えることでした。私の場合、「エンター」文字しかなかったので、それほど面倒ではありませんでした。

于 2012-07-24T07:35:41.600 に答える
7

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'を"<br/>に置き換えました。

    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);
                }
            }
        }
}

また、この方法はデフォルトのHtml.toHtml()の約4倍高速であることが判明しました。約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
于 2016-03-07T06:46:12.330 に答える
0

/ n =><br><br>を置き換えます

<p> hi </ p> <p> j </ p>

に:

<p> hi </ p> <br> <br> <p> j </ p>

于 2014-05-02T07:53:15.523 に答える