Android:在字符串,SpannedStrings和Spannablestrings之间进行转换

时间:2011-10-26 06:58:53

标签: android string resources textview

我有一个名为“foo”的字符串资源。它可能是一个简单的字符串......或者它可能包含HTML。这可能会随着时间的推移而改变:我应该能够在读取它是否为HTML时立即将其打包为至少一个SpannableString(但是如何?

我想得到原始的CharSequence,并且首先能够按原样显示它(确切的字符,而不是Android的“解释”)。现在我不能这样做... toString()决定撕掉它不认为我想看的部分。

然后,我希望能够通过使用某种方法(没有正常的方法工作)通过连接从此和其他字符串或SpannableStrings创建SpannableString。我想使用SpannableString在TextView中显示HTML格式的文本。

这应该不难,但很明显我做得不对(到目前为止我发现的信息很少)。 当然有一种方法可以在Strings,SpannedStrings甚至Spannablestrings之间准确地进行转换,而不会丢失沿途的标记?

请注意,我已经玩过一些有点破碎的Linkify,但我想要更好地控制这个过程(没有悬挂的未格式化的“/”,正确的hrefs等)如果我留在这里,我可以把这一切都搞定所有步骤都有HTML,但我无法连接任何内容。

编辑1:我已经知道我可以使用以下内容来始终确保我获得我的原始字符串(而不是Android决定它认为CharSequence真的是什么)。很好......现在,如何将它变成一个SpannableString?

<string name="foo"><![CDATA[
    <b>Some bold</b>
]]>
</string>

编辑2:不确定为什么这不能提前工作,但是......如果foo1和foo2是上面标记的字符串(如CDATA),那么显然可以这样做:

String foo1 = (String)getResources().getText(R.string.foo1);
String foo2 = (String)getResources().getText(R.string.foo2);
SpannedString bar = new SpannedString(Html.fromHtml(foo1+foo2));

好奇:有比这更简单的解决方案吗?这个CDATA业务真的有必要吗?它似乎令人费解(但不像从未完全知道资源类型将是什么...... ...字符串,跨越等等)

2 个答案:

答案 0 :(得分:1)

似乎没有更简单的方法来实现这一目标。

答案 1 :(得分:1)

我遇到了同样的问题。根据{{​​3}},有两种解决方案。

首先是在字符串资源中使用<转义&lt;标记。很遗憾,String转换会在后台删除标记。

其次是使用Format Strings而不是XML / HTML标签。它似乎更简单,更快速,并避免隐藏的转换问题。 getString(resource, ...)就像printf(string, ...)一样。

无论如何都需要一些代码来替换字符串的给定部分(处理标记或格式化字符串)。请享用! =)