2012-07-24 13 views
9

Biorę Spanned Text z pola EditText i konwertuję go na ciąg HTML oznaczony tagami HTML.toHtml. To działa dobrze. Sprawdziłem, czy ciąg znaków jest poprawny i zawiera numer
w odpowiedniej lokalizacji. Jednak, gdy mam zamiar przekonwertować znakowany ciąg z powrotem na tekst łączony w celu zapełnienia TextView lub EditText przy użyciu HTML.fromHtml, na końcu pierwszego akapitu znikają elementy
(lub wiele z nich, jeśli są obecne). Oznacza to, że jeśli użytkownik wprowadził tekst z wieloma podziałami wierszy i chciał zachować to formatowanie, zostałby utracony.HTML.fromHtml Linia Przerwanie znika

Dołączyłem obrazek, aby to zilustrować. Pierwszy EditText jest wprowadzany przez użytkownika, TextView Poniżej znajduje się wynik HTML.tohtml EditText powyżej, EditText poniżej jest wypełniany za pomocą HTML.fromHtml za pomocą ciągu w TextView nad nim. Jak widać, podziały linii zniknęły, a więc mają dodatkowe linie. Ponadto, gdy łączony tekst drugiego tekstu edycji jest uruchamiany przez HTML.toHtml, teraz tworzy inny znakowany tagiem HTML String. enter image description here

Chciałbym być w stanie podjąć HTML oznaczone String od pierwszego EditText i wypełnić inne TextView lub EditTexts bez utraty podziały wierszy i formatowanie. Wszelkie sugestie byłyby pomocne.

Dzięki

Odpowiedz

9

miałem też ten problem i nie mogłem znaleźć łatwy „przekształcić” lub coś rozwiązanie podobne. Zauważ, że coś ważnego, gdy użytkownik naciśnie "enter", java wygeneruje znak specjalny \n, ale w HTML nie ma takiego formatu łamania linii. Jest to <br />.

Więc, co zrobiłem, to zastąpić niektóre konkretne CharSequence s, z tekstu zwykłego, przez alternatywny format HTML. W moim przypadku była tylko postać "wejdź", więc nie było tak brudno.

0

wymienić/n => < br> < br>

przykład

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

do:

< p> cześć </p> < br> < br> < p> j </p>

2

Miałem podobny problem, gdy próbowałem zapisać/przywrócić zawartość editText do db. Problem jest w Html.toHtml, to jakoś pomija hamulce linia:

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> 

mam rozwiązać to za pomocą niestandardowych toHTML funkcjonować do serializacji tekstu łączonego, i zastąpić wszystkie „\ n” z "< 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); 
       } 
      } 
     } 
} 

Ponadto okazało się, że ten sposób jest szybszy w około 4 razy, że domyślna Html.toHtml(): zrobiłem odniesienia z około 20 stron i 200 przęseł:

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 
+0

kocham ty człowieku, zrobiłeś mój dzień! – michoprogrammer