是否可以为TextView中的不同文本设置多个样式?
例如,我将文本设置如下:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
是否可以为每个文本元素设置不同的样式?例如,line1粗体,word1斜体等
开发人员指南的Common Tasks and How to Do Them in Android包括Selecting, Highlighting, or Styling Portions of Text:
//获取我们的EditText对象 .
EditText vw =(EditText)findViewById(R.id.text);
//设置EditText的文本 .
vw.setText(“斜体,突出显示,粗体 . ”);
//如果这只是一个TextView,我们可以这样做:
// vw.setText(“斜体,突出显示,粗体 . ”,TextView.BufferType.SPANNABLE);
//强制它使用Spannable存储,以便附加样式 .
//或者我们可以在XML中指定它 .
//获取EditText的内部文本存储
Spannable str = vw.getText();
//创建我们的span部分,并为每个部分指定一种格式 .
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC),0,7,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new BackgroundColorSpan(0xFFFFFF00),8,19,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD),21,str.length() - 1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
但是在文本中使用了明确的位置编号 . 有更清洁的方法吗?
17 回答
如果你不想使用html,你可以创建一个styles.xml并像这样使用它:
如果有人想知道如何做到这一点,这是一种方式:(再次感谢马克!)
有关此方法支持的非官方标记列表,请参阅this link或此问题:Which HTML tags are supported by Android TextView?
Spanny使SpannableString更易于使用 .
实际上,除了Html对象之外,您还可以使用Spannable类型,例如TextAppearanceSpan或TypefaceSpan和SpannableString togather . Html类也使用这些机制 . 但是使用Spannable类型,您可以获得更多自由 .
如上所述,使用
TextView.setText(Html.fromHtml(String))
并在Html格式的字符串中使用这些标记:
http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html
It might be as simple as leveraging the String's length() method:
将Strings XML文件中的文本字符串拆分为多个子字符串(从Android的角度来看是一个单独的字符串),因为你需要不同的样式,所以它可能像: str1, str2, str3 (如你的情况),加入时一起是你使用的整个单个字符串 .
然后简单地按照“Span”方法,就像你提供代码一样 - 但不是单个字符串,而是将所有子字符串合并为一个字符串,每个子字符串都有不同的自定义样式 .
你仍然使用这些数字,但不是直接使用 - 它们现在不再采用硬编码形式(如代码中所示),但它们被组合的length()方法所取代(注意str之前的两颗星和后缀 . length()代替绝对数字来表示变化):
对于第一个字符串大小,然后 str.length() + 1, str.length() + str2.length() 表示第二个字符串大小,依此类推,包含所有子字符串,而不是例如0,7或8,19等......
Me Too
如何使用Kotlin和Anko使用一些漂亮的标记 -
现在不推荐使用
<b>
元素 .<strong>
呈现为<b>
,<em>
呈现为<i>
.this works fine for me
支持的标签列表是:
(来自http://developer.android.com/guide/faq/commontasks.html#selectingtext - 网站档案链接,
<resource>
拼写错误!)它还表明,在简单的情况下,并不真正需要
Html.fromHtml
.我遇到了同样的问题 . 我可以使用fromHtml,但我现在是android,而不是web,所以我决定尝试一下 . 我必须将其本地化,所以我使用字符串替换概念给它一个镜头 . 我将TextView上的样式设置为主要样式,然后格式化其他peices .
我希望这可以帮助其他人做同样的事情 - 我不知道为什么在框架中这不容易 .
我的字符串看起来像这样:
以下是款式:
这是我调用formatStyles方法的代码:
格式方法:
使用HTMLBuilder这是一种简单的方法
结果:
Some bold text 一些斜体文字
在网页底部使用辅助Spannable Class作为Android String Resources份额 . 你可以通过创建
CharSquences
并给它们一个样式来解决这个问题 .但是在他们给我们的例子中,只是为了大胆,斜体,甚至为文本着色 . 我需要在
CharSequence
中包含多个样式,以便将它们设置在TextView
中 . 所以对于那个类(我将其命名为CharSequenceStyles
),我刚刚添加了这个功能 .在视图中我添加了这个 .
希望这对你有所帮助!
稍微偏离主题,但我发现这个太有用了,不在这里提及 .
如果我们想从string.xml资源中读取Html文本并因此可以轻松进行本地化,那该怎么办? CDATA 使这成为可能:
从我们的Java代码,我们现在可以像这样使用它:
我没想到这会起作用 . 但确实如此 .
希望对你们中的一些人有用!
作为Jon said,对我来说这是最好的解决方案,你不需要在运行时设置任何文本,只使用这个自定义类HtmlTextView
就是这样,现在只把它放在你的XML中
用你的Html字符串
如果您希望能够在xml中添加样式文本,可以创建一个扩展TextView并覆盖setText()的自定义视图:
然后,您可以像这样使用它(用您的包名替换
PACKAGE_NAME
):使用
SpannableString
而不是html标记更轻量级 . 它帮助我看到视觉示例,所以这里是一个补充的答案 .这是一个
TextView
.进一步研究
Explain the meaning of Span flags like SPAN_EXCLUSIVE_EXCLUSIVE
Android Spanned, SpannedString, Spannable, SpannableString and CharSequence
Types of spans
这个例子最初的灵感来自here .
尝试
Html.fromHtml()
,并使用粗体和斜体HTML标记标记您的文字,例如: