Android上写界面的时候往往会遇到一些设计很奇怪,导致有些没法直接用原生的界面API来实现。这里主要记录一些TextView上的特殊效果的实现方式。
1、给TextView部分内容加粗,或者设置指定颜色。
String content = "恭喜玩家<b>王大锤</b>打败BOSS,获得<font color=\"#fbd860\"><b>金宝箱</b></font>";
Spanned tipSpanned = Html.fromHtml(content);
sampleView.setText(tipSpanned);
2、要灵活的组合文本内容:
下面这个可以灵活的指定规则,并根据具体内容来填充。学过C语言的话应该能想到跟printf函数的用法很类似。
String content = String.format("恭喜玩家<b>%1</b>打败BOSS,获得<font color=\"#fbd860\"><b>%2</b></font>",
"王大锤", "金宝箱");
有人肯定想将这个规则定义在res/values文件中,这样管理起来更方便。像这样:
res/values/strings.xml:
<resources>
<string name="notice_text_format"><![CDATA[恭喜玩家<b>%1s</b>打败最终BOSS,获得<font color=\"#fbd860\"><b>%2s</b></font>]]></string>
</resources>
java code:
String formatStr = getString(R.string.notice_text_format);
String content = String.format(formatStr,
"王大锤", "金宝箱");
Spanned tipSpanned = Html.fromHtml(content);
sampleView.setText(tipSpanned);
error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false"
attribute?
我在 StackOverflow找到了解决方案。
正确方法如下:
res/values/strings.xml:
<resources>
<string name="notice_text_format"><![CDATA[恭喜玩家<b>%%1s</b>打败最终BOSS,获得<font color=\"#fbd860\"><b>%%2s</b></font>]]></string>
</resources>
java code:
String formatStr = getString(R.string.notice_text_format, null);
String content = String.format(formatStr,
"王大锤", "金宝箱");
Spanned tipSpanned = Html.fromHtml(content);
sampleView.setText(tipSpanned);
看出区别来了么?
1、在xml中要用两个“%”来代替一个"%"。
2、我在java代码中是通过带有两个参数的getString来获取String资源。这样的原因是可以自动将两个“%”转换为一个“%”。