【问题标题】:Android - Class Html - fromHtml - How does it work?Android - 类 Html - fromHtml - 它是如何工作的?
【发布时间】:2012-10-26 23:14:14
【问题描述】:

我正在使用 Html.fromHtml 来获取描述标签的内容(在提要 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>

]]>

但当我查看documentation 时,它说:

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

所以我的问题是:我该如何做它所说的“然后你的程序可以通过并替换为真实图像”?

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

如果我不清楚,请说些什么,我会尝试更好地解释它。

编辑:

好吧,我正在尝试在一个简单的 rss 阅读器中实现这一点(并尝试在代码方面使其尽可能简单)

我正在使用一个 DOM 解析器,我正在使用一个 map = HashMap&lt;String, Spanned&gt; 来存储每个子节点的值,以及一个 KEY

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

在答案的 cmets 中,我发现了一个有用的 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&lt;HashMap&lt;String,Spanned&gt;&gt;

这里有什么问题吗?

【问题讨论】:

    标签: android html xml class parsing


    【解决方案1】:

    Html.fromHtml(...) 将用ImageSpan 和特殊的'object replacement character' (\uFFFC) 替换任何&lt;img ... /&gt; 标记。

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

    • 实现一个ImageGetter,它返回图像以显示为Drawable。如果我没记错的话,这将不允许您将图像加载卸载到不同的线程,因为它希望立即返回结果。因此,这应该足以满足本地资源(可能还包括设备本地存储中的任何资产,前提是不需要潜在的长时间运行的操作;即缩放、裁剪、应用效果等)。
    • 再次检查Spanned 结果并替换任何\uFFFC 出现。您应该能够使用getSource() 方法从每个ImageSpan 获取图像的源(url)。不幸的是,加载后似乎没有任何设置器来更新Drawable,所以我猜你可能需要用新的替换ImageSpan,在构造函数中传递加载的图像。李>

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

    【讨论】:

    • 关于第一点,ImageGetter,假设我将图像作为Drawable 返回。我必须把它放在ImageView 中,或者我可以把它放在object replacement character 的位置吗?如何?
    • @jsfrocha:不,您只需返回将显示在ImageSpan 内的Drawable - 无需使用不能放在@ 内的ImageView 987654345@无论如何。 Here's an example。顺便说一句,这里似乎有人想出了一个ImageGetter that loads your images in the background - 可能值得一试。
    • 所以我尝试了@momo 的link 这个解决方案,它可以编译、运行并且不会中途崩溃,但没有图像出现。它可能与我在哪里实施它有关。也许我应该在原始问题中提到它..要编辑它..
    • 关于如何做到这一点的任何想法?
    • 根据给定的 sn-ps,我真的不知道哪里出了问题。我猜这可能是因为您创建跨度的方式 - 我会尝试将整个 Html.fromHtml(...) 部分移动到自定义适配器中。但是,也许更好的是重新考虑您的方法。看起来您正在尝试使用缩略图填充列表,旁边有一些文本。那么为什么不使用带有ImageViewTextView 的适配器作为行布局呢?这是一种更标准的模式,周围会有大量资源来指导您。
    猜你喜欢
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多