第一:格式化字符串(动态设置字符串)
protected CharSequence getFun1Text() {
String srcStr = "Hello, %1$s! You have %2$05d new messages. 您目前的存款额为%3$+,.2f, 时间为:%4$tY-%4$tm-%4$te %4$tH:%4$tM";
//Or srcStr = getString(R.string.fun1_text); //<string name="fun1_text">"Hello, %1$s! You have %2$05d new messages. 您目前的存款额为%3$+,.2f, 时间为:%4$tY-%4$tm-%4$te %4$tH:%4$tM"</string>
String name = "fycus";
int num = 3;
float money = -1111.3f;
Calendar c = Calendar.getInstance();
String ret = String.format(srcStr, name, num, money, c);
return ret;
}
输出结果: Hello, fycus! You have 00003 new messages. 您目前的存款额为-1,111.30, 时间为:2014-05-16 10:46
解释一下:
srcStr中 %1$s %2$05d %3$+,.2f %4$tY 分别对应 String.format(srcStr, name, num, money, c); 中的后四个参数。
stirng中参数的一般格式 : %[index$][标识][最小宽度]转换方式。
index就是1、2、3、4,对应String.format()方法中的传参;
标识就是“+”、“0”、“,”等,其中“+”代表在字符串前加正负号,“0”代表在数位不够的情况下补“0”,如0033;
最小宽度表示这个数要表示成多少位0033就是4位;
转换方式:d-十进制 o-八进制 x或X-十六进制 s-字符串 f-浮点数 t-时间
给个文件下载地址,改文件对format的格式有很详细的说明 http://download.csdn.net/detail/u010366911/7354581
第二:以html格式显示
protected CharSequence getHtmlText1() {
String html="<html><head><title><b>TextView使用HTML</b></title></head><body><p><strong>强调</strong></p><p><em>斜体</em></p>"
+"<p><a href=\"http://www.dreamdu.com/xhtml/\">超链接HTML入门</a>学习HTML!</p><p><font color=\"#aabb00\">颜色1"
+"</p><p><font color=\"#00bbaa\">颜色2</p><h1>标题1</h1><h3>标题2</h3><h6>标题3</h6><p>大于>小于<</p>" +
"</body></html>";
return Html.fromHtml(html);
}
仅仅用一个 Html.fromHtml()方法即可解决问题。
不过有一个问题,上面代码中的string是硬编码,而我们习惯是将字符串写在string.xml中的,但如果我们将代码写成下面这样,又看不出html的效果。
<string name="html_text_wrong">Welcome to <b>Android</b>!</string>
//Wrong code
protected CharSequence getHtmlText11() {
String html= getString(R.string.html_text_wrong);
return Html.fromHtml(html);
}
文字没有变粗体,因为在 getString(R.string.html_text_wrong); 后 html_text_wrong 中的标签都被去掉了。传递给 Html.fromHtml()的只是 Welcome to Android!。
所以需要转换特殊字符,如下:
将 <string name="html_text_wrong">"Welcome to <b>Android</b>!"</string>
修改成 <string name="html_text">Welcome to <b>Android</b>! </string> 即可
如果html 文本比较多的话要将特殊字符一个个转换很麻烦,可以用TextUtils.htmlEncode() 方法来转换。
public void testTextUtils() {
String str = "Welcome to <b>Android</b>! ";
Log.e("fycus", "Encode string == " + TextUtils.htmlEncode(str));
}
第三:formater + html 上面两种情况的综合
这会遇到一个问题,如下代码:
private CharSequence getFormattedAndHtmlText() {
String name = "abcdef<b>g";
String text = "Welcome to <b>android</b>! , I am %1$s";
CharSequence ret = String.format(text, name);
ret = Html.fromHtml(ret.toString());
return ret;
}
输出结果是:
我们希望name="abcdef<b>g" 原样的输出,但是他却被转换了,因为 被Html.fromHtml()格式化了。
解决方法:
private CharSequence getFormattedAndHtmlText() {
String name = "abcdef<b>g";
String text = "Welcome to <b>android</b>! , I am %1$s";
CharSequence ret = null;
name = TextUtils.htmlEncode(name);
ret = String.format(text, name);
ret = Html.fromHtml(ret.toString());
return ret;
}
输出结果:
第四: plurals Quantity Strings
http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
英文不好看的不是很明白:译文地址 http://blog.csdn.net/ltl451011/article/details/6947642
个人理解:不同的语言中,对数量的使用方式有所不同,比如某个国家的人可能会说“0本书”、“1本书”,“2本书”,但是我们中国人没有“0本书”的说法,我们通常说的是“没有书”。所以在多语言的环境中,当语境中要显示“0本书”这个概念时,在“某个国家”的语言版本(values-somecontry/string.xml)中应该显示 “0本书”,而在中文语言环境下(values-zh) 软件则会显示字符串“没有书”
android提供了 plurals 来解决这个问题, 例子如下:
<plurals name="numbersOfBooks">
<item quantity="zero">我没有书.</item>
<item quantity="one">我有一本书.</item>
<item quantity="two">我有两本书.</item>
<item quantity="many">我有很多书.</item>
<item quantity="other">我有一些书.</item>
</plurals>
/**
* 测试的时候 将手机语言“中/英”切换
*
* @return
*/
private String quantityString() {
String ret = "";
ret = getResources().getQuantityString(R.plurals.numbersOfBooks, 1);
return ret;
}
手机为英文状态下输出:我有一本书.
手机为中文状态下输出:我有一些书.
原来因为中文没有复数语法,所以当语言是中文时,将总是获得quantity为other的字符串。 http://blog.csdn.net/sevenshal/article/details/10162571