[toc]
改变部分字符的颜色
TextSpannable
html
有时需要对TextView中的text做局部的样式改变,加粗或斜体等,由于Android可以兼容部分html标签,故可以在res/strings.xml文件中借助html标签去实现,常用的标签如下:
加粗字体
斜体字体
给字体加下划线
\n 换行
\u0020表示空格
\u2026表示省略号
例如我们要给部分字体加粗,可以这样写:1
<string name="text_part_style">加粗<b>重点</b>两个字</string>
然后直接在xml文件中引用1
2
3
4
5
6
7<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/abril_fatface"
android:text="@string/text_part_style"
android:textSize="30sp" />
也可以在代码中引用:1
textView.setText(Html.fromHtml("Hello <b>World</b>,<font size=\"3\" color=\"red\">AnalysisXmlActivty!</font>"));
设置类似于html那样的效果。
有时Android不能很好的区分标签中的<
和>
,故需要用它们的实体代替<
代表<
,>
代表>
.
例如设置a>b
,
html常用实体:
|显示结果 |描述 |实体名称 |实体编号|
|—|—|—|—|
| |空格 |\ |\ |
|< |小于号 |\< |\<|
|> |大于号 |\> |\>|
|& |和号 |\& |\&|
|” |引号 |\" |\"|
|’ |撇号 |\' (IE不支持) |\'|
|¢ |分(cent) |\¢ |\¢|
|£ |镑(pound) |\£ |\£
|¥ |元(yen) |\¥ |\¥
|€ |欧元(euro) |\€ |\€
|§ |小节 |\§ |\§
|© |版权(copyright) |\© |\©
|® |注册商标 |\® |\®
|™ |商标 |\™ |\™
|× |乘号 |\× |\×
|÷ |除号 |\÷ |\÷
占位符
Android支持以占位符的方式,定义字符串。
这里要先了解%n$d、%n$f和%n$s是和含义
举个例子:1
<string name="old">%1$s今年%2$d岁了</string>
%1$s: %1表示第一个可替换的变量 $s表示变量是string型
%2$d: %2表示第二个可替换的变量 $d 表示变量是整型
还有一个$f表示的是浮点型,目前android支持者三种类型的变量
如果想要在变量前加空格的,拿整型举例:1
<string name="old">%1$s今年%2$md岁了</string>
其中$md 中的m代表m个空格,其它的同理;
那么,如何在
有两个办法:
- 用%%来表示1个%,和转意符号 \ 的用法相同
- 如果你的字符串不需要格式化,可以在你的<string 标签上增加一个属性:formatted=”false”例如
<string name="test" formatted="false">% test %</string>
即可。
在使用该字符串时,可以在运行时动态替换占位符号,例如:1
2String str =getResources().getString(R.string.old_);
String string = str.format(str, "李小姐",27);
xliff
什么是xliff,参见百度百科
在写xliff之前 一定要引用xliff的命名空间,不引用xliff是无效的:1
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
xliff例子:1
<string name="old_"><xliff:g id="name">%1$s</xliff:g>今年<xliff:g id="age">%2$d</xliff:g>岁了</string>
代码中:1
2String str =getResources().getString(R.string.old_);
String string = str.format(str, "李小姐",27);
输出结果:1
李小姐今年27岁了
xliff文件和普通文件的区别
1、具有命名空间xmlns:xliff=”urn:oasis:names:tc:xliff:document:1.2”,这个必须要有。
2、在
xliff:g标签介绍:
属性id可以随便命名
属性example表示举例说明,可以省略
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00
plurals
由于不同的语言对数量的语法规定有不同的规则。 例如一小时是one hour, 两小时是two hours。 为了解决后缀的问题,Android引入了plurals 这种资源。
android对数量(单复数)进行处理 它支持zero,one,two,few,many,和other;可以理解plurals为一个数量集合的简单资源,它可以通过name的属性来访问(不是xml文件的name)。这样,你可以把plural资源和其他的简单资源一样放在同一个xml 文件里面,在同一个
quality的值和描述:
值 | 描述 |
---|---|
zero | 当前语言需要特别对待0 |
one | 当前语言需要特别对待1 |
two | 当前语言需要特别对待2 |
few | 当前语言需要特别对待few/small,也就是小数量的 |
many | 当前语言需要特别对待many/large,也就是大数量的 |
other | 当前语言没有要求对特定资源进行特殊对待 |
在工程的values下建一个xml文件 ,或者放在strings文件里也可以:1
2
3
4
5
6
7
8
9<?xml version="1.0" encoding="utf-8"?>
<resources >
<plurals name="hour">
<item quantity="zero"> zero hour </item>
<item quantity="one"> one hour </item>
<item quantity="other"> %d hours </item>
</plurals>
</resources>
name 就是plurals的属性名,其中plurals的Item可以是一个或多个,这就是一个完整的plurals资源文件;(%d代表的是整数)
下面是如何使用资源文件:1
2Resources res = getResources();
String string = res.getQuantityString(R.plurals.hour,2,8);
其中,2对应的是quantity=“other”,8对应的是other中占位符的值,也就是几小时。
getQuantityString()方法介绍:
/**
* Returns the string necessary for grammatically correct pluralization * of the given resource ID for the given quantity. * Note that the string is selected based solely on grammatical necessity, * and that such rules differ between languages. Do not assume you know which string * will be returned for a given quantity. See * <a href="{@docRoot}guide/topics/resources/string-resource.html#Plurals">String Resources</a> * for more detail. * * @param id The desired resource identifier, as generated by the aapt * tool. This integer encodes the package, type, and resource * entry. The value 0 is an invalid identifier. * @param quantity The number used to get the correct string for the current language's * plural rules. * * @throws NotFoundException Throws NotFoundException if the given ID does not exist. * * @return String The string data associated with the resource, * stripped of styled text information. */ @NonNull **public String getQuantityString(@PluralsRes int id, int quantity) throws NotFoundException { return getQuantityText(id, quantity).toString(); }** /** * Formats the string necessary for grammatically correct pluralization * of the given resource ID for the given quantity, using the given arguments. * Note that the string is selected based solely on grammatical necessity, * and that such rules differ between languages. Do not assume you know which string * will be returned for a given quantity. See * <a href="{@docRoot}guide/topics/resources/string-resource.html#Plurals">String Resources</a> * for more detail. * * <p>Substitution of format arguments works as if using * {@link java.util.Formatter} and {@link java.lang.String#format}. * The resulting string will be stripped of any styled text information. * * @param id The desired resource identifier, as generated by the aapt * tool. This integer encodes the package, type, and resource * entry. The value 0 is an invalid identifier. * @param quantity The number used to get the correct string for the current language's * plural rules. * @param formatArgs The format arguments that will be used for substitution. * * @throws NotFoundException Throws NotFoundException if the given ID does not exist. * * @return String The string data associated with the resource, * stripped of styled text information. */ @NonNull **public String getQuantityString(@PluralsRes int id, int quantity, Object... formatArgs) throws NotFoundException { }**
int id,是我们在string.xml里面写的plurals资源的id;int quantity,是数量的意思,也就是我们取具体item的判断依据,Object… formatArgs参数是占位符的值
但是当我们把quantity的值设为0时,程序并没有像我们期望的那样显示zero hour
,这是因为程序运行的时候,具体取的那个item,是取决于当前语言对单复数等形式的定义的。具体可以参见Android plurals源码分析;
如果非要在英文中特殊处理zero
的情况,可以借助下面要讲的MessageFormat
MessageFormat
1.在strings.xml文件中定义hour如下:1
<string name="hour">{0,choice,0#zero hour|1#One hour|1<{0} hours}</string>
2.在代码中引用hour1
String hour = MessageFormat.format(getSherlockActivity().getString(R.string.hour), number)
更多的例子:
例1:1
2
3
4
5
6
7
8
9
10
11
12double[] filelimits = {0,1,2};
String[] filepart = {"are no files","is one file","are {2} files"};
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
Format[] testFormats = {fileform, null, NumberFormat.getInstance()};
MessageFormat pattform = new MessageFormat("There {0} on {1}");
pattform.setFormats(testFormats);
Object[] testArgs = {null, "ADisk", null};
for (int i = 0; i < 4; ++i) {
testArgs[0] = new Integer(i);
testArgs[2] = testArgs[0];
System.out.println(pattform.format(testArgs));
}
例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14ChoiceFormat fmt = new ChoiceFormat(
"-1#is negative| 0#is zero or fraction | 1#is one |1.0<is 1+ |2#is two |2<is more than 2.");
System.out.println("Formatter Pattern : " + fmt.toPattern());
System.out.println("Format with -INF : " + fmt.format(Double.NEGATIVE_INFINITY));
System.out.println("Format with -1.0 : " + fmt.format(-1.0));
System.out.println("Format with 0 : " + fmt.format(0));
System.out.println("Format with 0.9 : " + fmt.format(0.9));
System.out.println("Format with 1.0 : " + fmt.format(1));
System.out.println("Format with 1.5 : " + fmt.format(1.5));
System.out.println("Format with 2 : " + fmt.format(2));
System.out.println("Format with 2.1 : " + fmt.format(2.1));
System.out.println("Format with NaN : " + fmt.format(Double.NaN));
System.out.println("Format with +INF : " + fmt.format(Double.POSITIVE_INFINITY));
关于MessageFormat的详细用法可以参见Java的API:MessageFormat或Java中MessageFormat的使用
更多string的用法,可以参见android String 资源 你所不知道的