是否有可能为一个TextView内的不同文本块设置多个样式?
例如,我将文本设置如下:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
是否可以为每个文本元素设置不同的样式?例如,行1加粗,字1斜体等。
开发者指南的常见任务和如何在Android中执行这些任务包括选择,突出显示或样式化文本部分:
// Get our EditText object.
EditText vw = (EditText)findViewById(R.id.text);
// Set the EditText's text.
vw.setText("Italic, highlighted, bold.");
// If this were just a TextView, we could do:
// vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);
// to force it to use Spannable storage so styles can be attached.
// Or we could specify that in the XML.
// Get the EditText's internal text storage
Spannable str = vw.getText();
// Create our span sections, and assign a format to each.
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);
但这使用了文本中的显式位置编号。有更干净的方法吗?
这可能就像利用String的length()方法一样简单:
将Strings XML文件中的文本字符串拆分为许多子字符串(从Android的角度来看是一个单独的字符串),因为你需要不同的风格,所以它可以像:str1, str2, str3(在你的情况下),当连接在一起时,就是你使用的整个单一字符串。
然后简单地遵循“Span”方法,就像您在代码中展示的那样——但不是单个字符串,而是将所有子字符串合并为单个字符串,每个子字符串具有不同的自定义样式。
你仍然使用这些数字,但不是直接使用——它们现在不再采用硬编码形式(就像在你的代码中那样),但它们被组合length()方法所取代(注意在str.length()之前和后面加上两颗星来代替绝对数字,以消除变化):
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, **str.length()**, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
对于第一个字符串大小,则str.length() + 1,对于第二个字符串大小,则str.length() + str2.length(),等等,所有的子字符串,而不是例如0,7或8,19等等…
正如Jon所说,对我来说,这是最好的解决方案,你不需要在运行时设置任何文本,只使用这个自定义类HtmlTextView
public class HtmlTextView extends TextView {
public HtmlTextView(Context context) {
super(context);
}
public HtmlTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
}
@TargetApi(21)
public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void setText(CharSequence s,BufferType b){
super.setText(Html.fromHtml(s.toString()),b);
}
}
就是这样,现在只把它放在XML中
<com.fitc.views.HtmlTextView
android:id="@+id/html_TV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/example_html" />
用你的Html字符串
<string name="example_html">
<![CDATA[
<b>Author:</b> Mr Donuthead<br/>
<b>Contact:</b> me@donut.com<br/>
<i>Donuts for life </i>
]]>