android String用法汇总

[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不能很好的区分标签中的<>,故需要用它们的实体代替&lt;代表<,&gt;代表>.
例如设置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. 用%%来表示1个%,和转意符号 \ 的用法相同
  2. 如果你的字符串不需要格式化,可以在你的<string 标签上增加一个属性:formatted=”false”例如 <string name="test" formatted="false">% test %</string>即可。

在使用该字符串时,可以在运行时动态替换占位符号,例如:

1
2
String 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
2
String 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标签。
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
2
Resources 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.在代码中引用hour

1
String hour = MessageFormat.format(getSherlockActivity().getString(R.string.hour), number)

更多的例子:
例1:

1
2
3
4
5
6
7
8
9
10
11
12
double[] 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
14
ChoiceFormat 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:MessageFormatJava中MessageFormat的使用
更多string的用法,可以参见android String 资源 你所不知道的