2012-08-09 296 views
6

在我的應用程序中,我使用Html.fromHtml(string).toString方法刪除一些<p>標籤,當我解析某些JSON時收到。HTML.fromHtml在文本末尾添加空格?

如果我離開<p>標籤上,該文本適合背景完美(背景是在高度和寬度WRAP_CONTENT一個相對佈局)。但是,如果我用fromHtml刪除<p>標籤,suddenely存在文字下方有巨大的空間,我相信這是fromHtml方法在最後添加空間的方法?

任何想法?

編輯:

以下是截圖: http://imgur.com/a/zIZNo

<p>標籤的一個是,這並不使用fromHtml的一個,很明顯! :)

編輯2:已找到解決方案,請參閱下面的答案。感謝Andro Selva幫助我告訴我有關正在添加的隱藏/n

+0

相關的任何差異截屏的文本大小會有所幫助我猜 – 2012-08-09 11:29:05

+0

添加截圖! – 2012-08-09 11:39:55

回答

8

解決方案發現:

fromHtml返回跨區類型。因此,我分配了返回給變量的內容,將其轉換爲字符串,然後對其使用.trim()方法。

它刪除了最後的所有空白。

+0

完美的作品。 – 2012-11-06 12:41:00

+0

就像一個魅力。 Thx老兄。修剪()是解決方案:)) – alicanbatur 2013-11-20 15:05:33

+3

這擺脫了額外的填充,但它也刪除各種格式(如粗體,斜體..)可能存在跨度..所以,爲什麼即使打擾的HTML ?? – Jakob 2014-06-10 08:52:12

5

是的,你認爲是真的正確。它增加了底部的空間。但在此之前,讓我解釋這是如何工作的。

你必須看看HTML類,看看它是如何工作的。

簡單來說,它就是這樣工作的:只要你的Html類看起來<p>標籤,它所做的只是在末尾附加兩個「\ n」字符。

在這種情況下,您在底部看到的空白空間實際上是因爲兩個\ n附加到了paragaraph的末尾。

而且我已經加入的HTML類是負責這次行動的實際方法,

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

    } 
} 

如果要覆蓋這個動作,你必須覆蓋的Html類本身這是一個有點棘手並不能在這裏完成。

編輯

這裏是鏈接到HTML類,

Html class

+0

謝謝你讓我知道正在添加的'/ n'。不過,我找到了自己的解決方案,會在下面寫出答案。 – 2012-08-09 11:58:16

2

如果你想在一個對象來使用它,或者試圖將它在一個特定的地方,請嘗試使用<a>標籤,而不是一個<p><p>末增加了返回車廂,一個寫沒有,但你要記住你自己寫\n<b>,你可以保持風格

0

@Andro Selva的解釋是正確的,沒有太多的事情要做。無奈的是,事情得到API 24,並且隨後與呼叫

Spanned fromHtml (String source, 
       int flags, 
       Html.ImageGetter imageGetter, 
       Html.TagHandler tagHandler); 

列入標誌的更好,我懷疑FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH標誌將降低標準段落終止到的雙「\ n \ n」的單行「\ n」的換行符

鑑於Android版本的歷史〜我無法專門爲Android API 24+編寫軟件!所以...我發現了一個包含兩個額外的自定義標籤的kludge解決方案。

1. <scale factor="x.xx">... </scale> 
2. <default>... </default> 

都通過這種方法

private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) { 
       int len = output.length(); 
       if (opening) { 
        System.out.println("scalefactor open: " + scalefactor); 
        output.setSpan(new RelativeSizeSpan(scalefactor), len, len, 
          Spannable.SPAN_MARK_MARK); 
       } else { 
        Object obj = getLast(output, RelativeSizeSpan.class); 
        int where = output.getSpanStart(obj); 
        scalefactor = ((RelativeSizeSpan)obj).getSizeChange(); 
        output.removeSpan(obj); 
        System.out.println("scalefactor close: " + scalefactor); 
        if (where != len) { 
         output.setSpan(new RelativeSizeSpan(scalefactor), where, len, 
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
        } 
       } 
      } 

其從供給到Html.fromHtml方法,即自定義TagHandler稱爲調用RelativeSizeSpan類:

private static class CustomTagHandler implements Html.TagHandler { 

    private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) { 
      int len = output.length(); 
      if (opening) { 
       //mSizeStack.push(scalefactor); 
       System.out.println("scalefactor open: " + scalefactor); 
       output.setSpan(new RelativeSizeSpan(scalefactor), len, len, 
         Spannable.SPAN_MARK_MARK); 
      } else { 
       Object obj = getLast(output, RelativeSizeSpan.class); 
       int where = output.getSpanStart(obj); 
       scalefactor = ((RelativeSizeSpan)obj).getSizeChange(); 

       output.removeSpan(obj); 

       //scalefactor = (float)mSizeStack.pop(); 
       System.out.println("scalefactor close: " + scalefactor); 
       if (where != len) { 
        output.setSpan(new RelativeSizeSpan(scalefactor), where, len, 
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       } 
      } 
     } 
... 
     final HashMap<String, String> mAttributes = new HashMap<>(); 

     @Override 
     public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { 
      String Attr; 
      processAttributes(xmlReader); 
      if ("default".equalsIgnoreCase(tag)) { 
       ProcessRelativeSizeTag(mDefaultTextSize, opening, output); 
       return; 
      } 

      if ("scale".equalsIgnoreCase(tag)) { 
       Attr = mAttributes.get("factor"); 
       if (Attr != null && !Attr.isEmpty()) { 
        float factor = parseFloat(Attr); 
        if (factor > 0) 
         ProcessRelativeSizeTag(factor, opening, output); 
       } 
       return; 
... 
      } 

     } 

要使用,我設置將Textview對象的文本大小設置爲1.即1像素!然後在變量mDefaultTextSize中設置所需的真實文本大小。我有所有這些TextView延伸爲htmlTextView中HTML功能:

public class htmlTextView extends AppCompatTextView { 
    static Typeface mLogo; 
    static Typeface mGAMZ; 
    static Typeface mBrush; 
    static Typeface mStandard; 
    int GS_PAINTFLAGS = FILTER_BITMAP_FLAG | ANTI_ALIAS_FLAG | SUBPIXEL_TEXT_FLAG | HINTING_ON; 
    static float mDefaultTextSize; 
    static Typeface mDefaultTypeface; 
etc 

}

其中包括公共方法

public void setDefaultTextMetrics(String face, float defaultTextSize) { 
     mDefaultTypeface = mStandard; 
     if (face != null) { 
      if ("gamz".equalsIgnoreCase(face)) { 
       mDefaultTypeface = mGAMZ; 
      } else { 
       if ("brush".equalsIgnoreCase(face)) { 
        mDefaultTypeface = mBrush; 
       } 
      } 
     } 
     setTypeface(mDefaultTypeface); 
     setTextSize(1); 
     mDefaultTextSize = defaultTextSize; 
    } 

簡單((htmlTextView)tv).setDefaultTextMetrics(null, 30);調用將我htmlTextView用我的標準字體作爲默認文本大小爲30.

然後當我g香港專業教育學院是這個例子中fromHtml使用方法:

<string name="htmlqwert"> 
<![CDATA[ 
     <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p> 
     <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p> 
     <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p> 
     <p><default><scale factor="1.5"><box> qwertQWERT </box></scale></default></p> 
]]> 
</string> 

我的自定義標籤<box>只是讓我突出顯示文本的背景。看到附加的圖片,使用<default>標籤與TextView文字大小設定爲1和<default>標籤通過30倍調用RelevantSizeSpan示出一個結果,和一個用:不使用<default>標籤但設置

<string name="htmlqwert"> 
    <![CDATA[ 
      <p><scale factor="1.5"><box> qwertQWERT </box></scale></p> 
      <p><scale factor="1.5"><box>qwertQWERT</box></scale></p> 
      <p><scale factor="1.5"><box>qwertQWERT</box></scale></p> 
      <p><scale factor="1.5"><box>qwertQWERT</box></scale></p> 
    ]]> 
    </string> 

TextView文字大小改爲30。在第一種情況下,額外的新線仍然存在,但它只有1個像素高!

NB <scale factor="1.5">...</scale>標籤沒有實際意義。他們只剩下來自其他測試的文物。

結果:下面這兩個例子有段落間2個換行符但是,在左側的一個,這些線中的一條是隻有1個像素高。我將它留給讀者找出如何將其降低到零,但不要使用0