我有一个来自Web服务的文本块,根据我预定义的一些标签,我想在将文本设置为TextView之前设置样式。对于粗体,斜体和下划线,我可以使用replaceAll命令轻松完成此操作:
PageText = PageText.replaceAll("\\*([a-zA-Z0-9]+)\\*", "<b>$1</b>");
PageText = PageText.replaceAll("=([a-zA-Z0-9]+)=", "<i>$1</i>");
PageText = PageText.replaceAll("_([a-zA-Z0-9]+)_", "<u>$1</u>");
txtPage.setText(Html.fromHtml(PageText), TextView.BufferType.SPANNABLE);
所以,要加粗一个单词,用*表示它,用斜体表示,用_包围。
但是,对于删除线,Html.fromHtml不支持“strike”标记,因此不能以同样的方式完成。我已经看到使用Spannable在文本的一个部分上设置样式的示例,但它需要位置编号。所以,我想我可以遍历文本,搜索 - (标记代表警示),然后搜索下一个,跨越中间的文本,并重复所有这些字符串。它最终将成为10行循环代码,而其他代码则为1行,所以我想知道是否有更优雅的解决方案。
答案 0 :(得分:93)
如果它只是TextView,你可以使用油漆标记
TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
答案 1 :(得分:30)
@Suresh解决方案如果您想要删除整个TextView,但如果您想仅删除文本的某些部分,则使用下面的代码。
tvMRP.setText(text, TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) tvMRP.getText();
spannable.setSpan(new StrikethroughSpan(), 3, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
此处text
是我们希望TextView显示的文字,3
是否。从删除线开始的字符(从0开始)。
答案 2 :(得分:1)
以下是使用自定义TagHandler的解决方案,您必须传递给Html.fromHtml()。
答案 3 :(得分:1)
您可以使用自定义TagHandler
执行此操作,例如on this SO question:
Spanned parsed = Html.fromHtml(PageText, null, new MyHtmlTagHandler());
TagHandler
实现了方法:
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
processStrike(opening, output);
}
}
....
答案 4 :(得分:0)
您确定Html.fromHtml
不支持<strike>
吗?它列在this Commonsware blog post
答案 5 :(得分:0)
看起来似乎并不支持,至少它在Android 3.1上不起作用。
@ RMS2如果文字较小,您可以将其分成两个或三个单独的文本视图,并仅将标记应用于您想要的文本,不适用于长文本;(