2012-07-24 22 views
3

全部,插入到TextViews和EditText中的HTML格式的字符串

我有一個數據庫,它將存儲HTML標記的文本以保留EditText的格式信息。我使用HTML.toHtml(EditText.getText)創建了這個字符串。我注意到這個方法將<p> and </p>包含在其中的任何Spanned文本。與此相關的問題是,當我使用方法HTML.fromHtml(HTMLFormattedString),然後使用TextText或EditText的setText方法時,在實際文本的末尾會有兩個額外的行,這很有道理,因爲這就是段落標記與HTML一起工作。

我的問題是有無論如何使textView或EditText縮小不顯示額外的空行?什麼是最簡單的方法來做到這一點?我已經嘗試刪除最後一個<p> and </p>,但只有在用戶沒有用返回鍵輸入3個或更多新行時纔有效。

回答

3

我最終在創建和刪除的跨越文本末尾搜索空白。由於<p> </p>,這照顧了額外的空間,並且比覆蓋所提到的類以獲得相同的結果花費更少的時間。

public SpannableStringBuilder trimTrailingWhitespace(
     SpannableStringBuilder spannableString) { 

    if (spannableString == null) 
     return new SpannableStringBuilder(""); 

    int i = spannableString.length(); 

    // loop back to the first non-whitespace character 
    while (--i >= 0 && Character.isWhitespace(spannableString.charAt(i))) { 
    } 

    return new SpannableStringBuilder(spannableString.subSequence(0, i + 1)); 
} 
2

那麼這只是一個圓的方法。我遇到過同樣的問題。你有兩種選擇,

1)正如你所說,段落標籤的工作方式你懷疑。它的作用是在每個< \ p>標籤的末尾附加兩個「\ n」值。所以,你可以將HTML轉換爲字符串,刪除最後兩個字符通常是兩個「\ n」 S

2)你已經獲得到HTML類本身。也就是說,你必須重寫HTML類並尋找handleP(SpannableStringBuilder text)並稍微改變它的核心邏輯。

private static void handleP(SpannableStringBuilder text) { 
    int len = text.length(); 

    if (len >= 1 && text.charAt(len - 1) == '\n') { 
     if (len >= 2 && text.charAt(len - 2) == '\n') { 
      return; 
     } 
     text.append("\n"); 
     return; 
    } 

    if (len != 0) { 
     text.append("\n\n"); 


    } 
} 

正如你可以在這裏看到,它附加在len!=0兩個「\ n」,這是是你必須做的改變。

+1

+1思考轉到文檔。你究竟在哪裏看btw?只是懶得自己去看。 – 2012-07-24 05:03:22

+1

Vinay你在這裏找到它 - http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/text/Html.java#HtmlToSpannedConverter.handleP %28android.text.SpannableStringBuilder%29 – 2012-07-24 05:20:07

+0

這裏的問題是你引用的類是受保護的,你不能覆蓋該方法。從本質上講,您正在重新創建一個自定義的HTML類。 – 2012-07-24 13:57:18