2014-05-14 68 views
1

我有HTML文本,我需要在TextView中顯示。 html可能看起來像這樣 -Android - Html.fromHtml句柄背景顏色

<font color="#AFEEEE"><font style="background-color: rgb(255,140,0);">Text with background and color</font></font> 

Html.fromHtml不支持除字體標記顏色之外的任何其他屬性。但我們絕對必須展示背景。我可以編寫自定義標記處理程序,但屬性不會傳入,只傳遞標記。 實現此目的的最佳方法是什麼?

注意:不能使用Webview。


我試了下面的代碼。如果我在文本上設置了raw,它就可以工作,但如果我進一步處理它並將其傳遞給Html.fromHtml,它不會顯示背景。

public static final String sText = 
    "Background on <font style=\"background-color: rgb(255,255,0);\">pa</font>rt text only"; 

     Pattern pattern = Pattern.compile(BACKGROUND_PATTERN); 
     Matcher matcher = pattern.matcher(sText); 
     SpannableString raw = new SpannableString(sText); 
     BackgroundColorSpan[] spans = 
      raw.getSpans(0, raw.length(), BackgroundColorSpan.class); 
     for (BackgroundColorSpan span : spans) { 
      raw.removeSpan(span); 
     } 

     while (matcher.find()) { 
      raw.setSpan(new BackgroundColorSpan(0xFF8B008B), 
       matcher.start(2), matcher.start(2) + matcher.group(2).length(), 
       Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
     sText = raw.toString(); 
     final Spanned convertedHtml = 
      Html.fromHtml(sText, ig, new myTagHandler()); 
+1

使用jsoup來解析HTML,以訪問樣式對象和背景色中,然後設置顏色爲背景,以您的觀點。 – njzk2

回答

1

根據需要添加您自己的BackgroundColorSpan

下面是一些代碼,設置這樣的跨度上搜索項的所有事件中的TextView

private void searchFor(String text) { 
    TextView prose=(TextView)findViewById(R.id.prose); 
    Spannable raw=new SpannableString(prose.getText()); 
    BackgroundColorSpan[] spans=raw.getSpans(0, 
              raw.length(), 
              BackgroundColorSpan.class); 

    for (BackgroundColorSpan span : spans) { 
     raw.removeSpan(span); 
    } 

    int index=TextUtils.indexOf(raw, text); 

    while (index >= 0) { 
     raw.setSpan(new BackgroundColorSpan(0xFF8B008B), index, index 
      + text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
     index=TextUtils.indexOf(raw, text, index + text.length()); 
    } 

    prose.setText(raw); 
    } 

所以,找到你的起點和終點,創建一個BackgroundSpan你想要的顏色,並使用setSpan()來應用它。

請注意,這裏假定只有部分文本需要背景顏色。如果整個TextView需要顏色,請使用njzk2的建議,並將顏色應用於整個TextView

+0

儘管上述解決方案有效,但我還需要調用Html.fromHtml來轉換其他標記,如粗體,斜體等。因此,在調用Html.fromHtml之前甚至之後都不能使用上述方法。 – user1018916

+0

@ user1018916:爲什麼不呢?跨度可以重疊AFAIK,上面的代碼隻影響'BackgroundColorSpan'。 – CommonsWare

+0

我一定錯過了一些東西。 Html.fromHtml接受字符串。但是,如果我先搜索並應用背景跨度,然後將其傳遞給HTML,則不會放入背景顏色。粘貼在我的帖子上面。 – user1018916

0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
    String str = "<span style=\"background-color:#f3f402;\">" + TEXT TO HIGHLIGHT + "</span>"; 
    textView.setText(Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY)); 
} else { 
    String str = "<font color='#f3f402'>" + TEXT TO HIGHLIGHT + "</font>"; 
    textView.setText(Html.fromHtml(str)); 
} 

更多 - https://stackoverflow.com/a/46035856/3625510