開發中常遇到要彈出文本提示窗的需求,而且文本內容要突出某些點,所以要對局部文本進行樣式設置,特整理 “局部文本” 樣式設置的幾種情形。
1、在 strings.xml 文件中直接使用 Android 支持的標籤
<string name="content">111<font color="red">222</font>333</string>
<TextView
... ...
android:text="@string/content" />
但是,不能採用下面這種樣式,即是說,上面這種方法可採用的顏色有限
<string name="content">111<font color="#ff0000">222</font>333</string>
如果在代碼中直接 setText,則設置的顏色無效,採用默認字體顏色
tvTipContent.setText(getString(R.string.content));
2、在 strings.xml 文件中使用 html 樣式
<string name="html_tip">
<Data><![CDATA[
<p>1、第一項:
<br/> 第一行第一項
<br/> 第一行第二項
<br/> <font color="#ff0000"><b>第一行第三項</b></font></p>
<p>2、第二項</p>
3、第三項
]]></Data>
</string>
<TextView
... ...
android:text="@string/html_tip" />
如果在代碼中直接 setText(getString(R.string.html_tip)),則設置的顏色及 html 效果均無效,採用默認字體顏色
tvTipContent.setText(getString(R.string.html_tip));
如果要設置的顏色及 html 效果有效,需使用 Html.fromHtml() 方法
tvTipContent.setText(Html.fromHtml(getString(R.string.html_tip)));
需要注意的是,上面使用 Html.fromHtml() 方法,要達到 html 樣式,需要在要顯示的文本內容外層套上下面的標籤
<string name="html_tip">
<Data><![CDATA[
... ...
]]></Data>
</string>
3、在代碼中直接設置拼接的字符串
下面這種方式無效
tvTipContent.setText("11<font color="red">22</font>33");
下面這種方式無效
tvTipContent.setText(Html.fromHtml("<Data><![CDATA[\n" +
" <p>1、第一項:\n" +
" <br/> 第一行第一項\n" +
" <br/> 第一行第二項\n" +
" <br/> <font color=\"#ff0000\"><b>第一行第三項</b></font></p>\n" +
" <p>2、第二項</p>\n" +
" 3、第三項\n" +
" ]]></Data>"));
去掉外層的 <Data><![CDATA[... ...]]></Data> 後纔有效
tvTipContent.setText(Html.fromHtml(
" <p>1、第一項:\n" +
" <br/> 第一行第一項\n" +
" <br/> 第一行第二項\n" +
" <br/> <font color=\"#ff0000\"><b>第一行第三項</b></font></p>\n" +
" <p>2、第二項</p>\n" +
" 3、第三項"));
4、使用 SpannableString 類
SpannableString sStr = new SpannableString("設置指定 Index 的字體樣式");
sStr.setSpan(new ForegroundColorSpan(Color.parseColor("#ff0000")), 3, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sStr.setSpan(new ForegroundColorSpan(Color.RED), 11, 13, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvTipContent.setText(sStr);
SpannableString 還有很多用法,能達到很炫酷的文本樣式,可自行使用體會 …