Android - Class Html - fromHtml - 它是如何工作的?

时间:2012-11-06 22:38:57

标签: android html xml class parsing

我正在使用Html.fromHtml来获取描述标记的内容(在feed XML中)并且它工作正常

描述标签:

<description><![CDATA[<div class="K2FeedIntroText"><p><img style="margin: 10px; float: left;" alt="block curta" src="http://loc.grupolusofona.pt/images/stories/destaques/block%20curta.jpg" height="110" width="120" />Quatro Horas Descalço é o nome da curta-metragem, realizada por Ico Costa, que se estreia mundialmente no 7.º Festival Internacional de Cinema de Roma, nos dias 12 e 13 de novembro, em competição no Cinema XXI.</p>

]]&GT;

但是当我查看documentation它说:

Returns displayable styled text from the provided HTML string. Any <img> tags in the HTML will display as a generic replacement image which your program can then go through and replace with real images.

所以我的问题是:我怎么能做它所说的“你的程序可以通过哪些方式来取代真实的图像”?

我知道如何使用Pattern通过RegEx获取img url,我只是想知道如何使用该类“通过并用图像替换它”

如果我不清楚并且生病了,请说些什么。

修改

好吧,我正在尝试在一个简单的rss阅读器中实现它(并尝试尽可能简单地保持代码方式)

我正在使用DOM Parser,我使用map = HashMap<String, Spanned>来存储每个子节点的值以及KEY

map.put(KEY_DESC, Html.fromHtml(parser.getValue(e, KEY_DESC)));

在答案的评论中,我找到了一个有用的link,我从中创建了一个新的类(URLImageParser)并试图像这样使用它:

map.put(KEY_DESC, htmlSpan);

htmlSpan的结果是:

this.textView = (TextView)this.findViewById(R.id.textview);
URLImageParser p = new URLImageParser(textView, this);
Spanned htmlSpan = Html.fromHtml(html, p, null);
textView.setText(htmlSpan);

我还创建了一个android:visibility="gone" TextView,以防它需要将值存储在TextView中(可能我解释错了)

我最初的想法是htmlSpan属于Spanned类型,所以它很适合我的HashMap。

要上传到ListView我正在使用SimpleAdapter,如此:

    ListAdapter adapter = new SimpleAdapter(this, menuItems, R.layout.linhafeed, 
            new String[] { KEY_TITLE, KEY_DESC, KEY_PUBDATE, KEY_LINK },
            new int[] { R.id.title, R.id.desc, R.id.pub, R.id.link });

menuItemsArrayList<HashMap<String,Spanned>>

的位置

我在这里遇到了什么问题?

1 个答案:

答案 0 :(得分:3)

Html.fromHtml(...)会将所有<img ... />代码替换为ImageSpan和特殊'object replacement character' (\uFFFC)

要显示实际图像,看起来有两个选项:

  • 实现ImageGetter,返回图片以显示为Drawable。如果我没记错的话,这将不允许您将图像加载到另一个线程,因为它希望立即返回结果。因此,这应该足以满足本地资源(也可能是设备本地存储中的任何资产,只要不需要长时间运行的操作;即缩放,裁剪,应用效果等)。
  • Spanned结果进行第二次传递,并替换所有\uFFFC次出现。您应该能够使用ImageSpan方法从每个getSource()获取图像的来源(网址)。不幸的是,它看起来没有任何setter在加载后更新Drawable,所以我猜你可能需要用新的替换ImageSpan,传入加载后的图像构造

第三种选择,可能比上面的重量更重,是使用WebView而不是TextView。这样,您就不必自己处理任何图像加载,因为它内置于窗口小部件中。