你所不知道的string.xml
String
能被应用程序或者其他资源文件(比如layout XML)引用的单个字符串。
注意:字符串是简单类型资源,是用名称(name)(而非XML文件名)来直接引用的。因此,在一个XML文件里,可以把字符串资源和其他简单类型资源一起放在一个<resources>元素下。
文件位置
res/values/filename.xml
文件名可随意指定。<string>元素的name将被用作资源ID。
编译后资源的数据类型
指向String
的资源指针。
资源引用
Java代码::R.string.string_name
XML代码:@string/string_name
语法
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="string_name">text_string</string> </resources> |
元素
<resources>
必填项。必须是根元素。
无属性。
<string>
可以包含样式标记的字符串。注意须对单引号或双引号进行转义。更多信息请参阅下文格式化和样式化。
属性:
name
String类型。字符串的名称。此名称将作为资源ID用于引用此字符串。
示例
保存在res/values/strings.xml 的XML文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> </resources> |
以下布局(layout)XML将字符串资源用于View:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> |
以下应用程序代码读取一个字符串资源:
String string = getString(R.string.hello); |
可以用getString(int)
或getText(int)
来读取字符串资源,getText(int)
会一并读取应用于字符串的rich text样式。
String Array
可被应用程序引用的字符串数组。
注意:字符串数组是简单类型资源,是用名称(而非XML文件名)来直接引用的。因此,在一个XML文件里,可以把字符串数组资源和其他简单类型资源一起放入一个<resources>元素下。
文件位置
res/values/filename.xml
文件名可随意指定。<string-array>元素的名字name将被用作资源ID。
编译后资源的数据类型
指向String
数组的资源指针。
资源引用
Java代码: R.array.string_array_name
语法
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="string_array_name"> <item >text_string</item> </string-array> </resources> |
元素
<resources>
必填项。必须是根元素。
无属性。
<string-array>
定义一个字符串数组。包含了一个或多个<item>元素。
属性:
Name
String类型。字符串数组的名称。此名称将作为资源ID用于引用此数组。
<item>
一个字符串,可以包含样式标识。可以是对其他字符串资源的引用。必须作为<string-array>元素的子元素存在。注意对单引号和双引号须进行转义。有关如何正确地样式化及格式化字符串,请参阅下文格式化和样式化。
无属性。
示例
保存在res/values/strings.xml 的XML文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item></string-array> <item>Venus</item> <item>Earth</item> <item>Mars</item> </string-array> </resources> |
以下程序代码返回字符串数组:
Resources res = getResources(); String[] planets = res.getStringArray(R.array.planets_array); |
Quantity Strings(复数)
不同的语言对数量进行描述的语法规则也不同。比如在英语里,数量1是个特殊情况,我们写成“1 book”,但其他任何数量都要写成“nbooks”。这种单复数之间的区别是很普遍的,不过其他语言会有更好的区分方式。Android支持的全集包括zero、one、 two、few、many和other。
决定选择和使用某种语言和复数的规则是非常复杂的,所以Android提供了诸如getQuantityString()的方法来选择合适的资源。
注意,要按照语法规则来建立可选项。在英语里,即使数量为0,字符串零(zero)也不需要建立。因为0在英语语法表达上和2没有区别,和其他除1以外的任何数字都没有差别("zero books", "one book", "two books",等等)。 不要被“two听起来似乎只能用于数量2” 样的事误导。某语言可能需要2、12、102(等等)和1一样形式表示,而又与其他数的形式都不同。请依靠翻译人员来了解一下实际语言中的差别。
如果和应用程序的风格一致,常可以用诸如“Books: 1”的模糊数量形式来避免使用数量字符串。这会让你和翻译人员都轻松些。
注意:复数字符串是简单类型资源,是用名称(name)(而不是XML文件名)来直接引用的。因此,在一个XML文件里,可以把复数字符串资源和其他简单类型资源一起放在一个<resources>元素下。
文件位置
res/values/filename.xml
文件名可随意指定。<plurals>元素的名字name将被用作资源ID。
资源引用
Java代码::R.plurals.plural_name
语法
<?xml version="1.0" encoding="utf-8"?> <resources> name="plural_name"> <item_plurals quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources> |
元素
<resources>
必填项。必须是根元素。
无属性。
<plurals>
一个字符串集,每个数量表示提供一个字符串。包含一个或多个<item>元素。
属性:
name
String类型。字符串对的名称。此名称将作为资源ID。
<item>
一个单数或复数形式的字符串。可以是对其他字符串资源的引用。必须作为<plurals>元素的子元素存在。注意须对单引号和双引号进行转义。有关如何正确地样式化及格式化字符串,请参阅下文格式化和样式化。
属性:
quantity
关键字。 表示要使用此字符串的数量值。以下是合法的值(括号内列出部分语言要求):
值 |
描述 |
zero |
语言需要对数字0进行特殊处理。(比如阿拉伯语) |
one |
语言需要对类似1的数字进行特殊处理。(比如英语和其它大多数语言里的1;在俄语里,任何以1结尾但不以11结尾的数也属于此类型。) |
two |
语言需要对类似2的数字进行特殊处理。(比如威尔士语) |
few |
语言需要对较小数字进行特殊处理(比如捷克语里的2、3、4;或者波兰语里以2、3、4结尾但不是12、13、14的数。) |
many |
语言需要对较大数字进行特殊处理(比如马耳他语里以11-99结尾的数) |
other |
语言不需要对数字进行特殊处理。 |
示例
存放在res/values/strings.xml 的XML文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">One song found.</item> <item quantity="other">%d songs found.</item> </plurals> </resources> |
存放在res/values-pl/strings.xml 的XML文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">Znaleziono jedną piosenkę.</item> <item quantity="few">Znaleziono %d piosenki.</item> <item quantity="other">Znaleziono %d piosenek.</item> </plurals> </resources> |
Java代码:
int count = getNumberOfsongsAvailable(); Resources res = getResources(); String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable,count, count); |
在使用getQuantityString()方法时,如果字符串包含数字格式化串,则需要传递2个count参数。例如:对于字符串“%d songs found”,第一个count参数选择合适的复数字符串,第二个count参数插入占位符%d中。如果复数字符串资源不包含格式化信息,就不需要给getQuantityString()传递第三个参数。
格式化和样式化
关于如何格式化和样式化字符串资源,下面这些比较重要的地方应该了解。
单引号和双引号的转义
如果字符串里包含单引号或双引号,必须进行转义,或者把整个串封闭在与当前引号不同的成对的引号内。下面是一些有效或无效的字符串示例:
<string name="good_example">"This'll work"</string> <string name="good_example_2">This\'ll also work</string> <string name="good_example_2">This\'ll also work</string> <string name="bad_example">This doesn't work</string> <string name="bad_example_2">XML encodings don’t work</string> |
字符串的格式化
如果需要使用String.format(String, Object...)格式化字符串,可以把格式化参数放在字符串(string)资源里。比如存在以下资源:
<string name="welcome_messages">Hello, %1s!Youhaves!Youhaved new messages.</string> |
此例中存在两个参数:%1$s是个字符串,%2$d 是个数字。则在应用程序中可以用如下方式用参数来格式化字符串:
<xliff:g>标签介绍:
属性id可以随便命名
属性值举例说明
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00
也可简单写成:
%d (表示整数)
%f (表示浮点数)
%s (表示字符串)
使用步骤举例:
1.记得要在字符文件中加上这些:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
2.
<string name="test_xliff">小姐今年<xliff:g id="xxx">%1d</xliff:g>岁了,上<xliff:g id="yyy">%2s</xliff:g>年级!</string>
或者
<string name="test_xliff">小姐今年<xliff:g id="xxx">%d</xliff:g>岁了,上<xliff:g id="yyy">%s</xliff:g>年级!</string>
加上参数和空格的写法是:
<string name="test_xliff">小姐今年<xliff:g id="xxx">%1$3d</xliff:g>岁了,上<xliff:g id="yyy">%2$5s</xliff:g>年级!</string>
3.
String test = String.format(getResources().getString(R.string.test_xliff), 7, "二");
输出:
小姐今年7岁了,上二年级!
加上参数和空格的输出:
小姐今年 7岁了,上 二年级!
- String sAgeFormat = getResources().getString(R.string.old);
- String sFinalAge = String.format(sAgeFormat, 23);
- <span style="font-size:14px;">String sAgeFormat = getResources().getString(R.string.old);
- String sFinalAge = String.format(sAgeFormat, 23);</span>
- view sourceprint?1 String sAgeFormatString sAgeFormat1= getResources().getString(R.string.alert);
- String sFinal1 = String.format(sAgeFormat1, "李四","首都北京");
- <span style="font-size:14px;">view sourceprint?1 String sAgeFormatString sAgeFormat1= getResources().getString(R.string.alert);
- String sFinal1 = String.format(sAgeFormat1, "李四","首都北京");
- </span>
1,resrouces标签中增加属性xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"
2,string值中添加<xliff:g id="kk">%s</xliff:g>,其中%s表示替换部分
3,程序中使用Resources.getString(int id, Object... formatArgs)获取替换后的string
4,getString可以替换不定数目的值,如果在xml配了n个变量,这里必须有>=n个替换项
更简单地,在2.3中直接用Context.getString就可以读取含%s的String
Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username,mailCount); |
用HTML标记来样式化
可以用HTML 标记来为字符串加入样式。例如:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> </resources> |
支持以下HTML元素:
· <b>文本加粗bold。
· <i>文本变斜体italic。
· <u>文本加下划线underline。
有时可能要创建一个样式化的文本资源,并可作为格式化串使用。通常这不能生效,因为String.format(String, Object...)方法会去除字符串内的所有的样式信息。解决方法是写入一段转义后的HTML标记,然后在格式化后再用fromHtml(String)恢复出这些样式。例如:
1. 将样式化的文本资源存储为转义后的HTML字符串:
<resources> <string name="welcome_messages">Hello, %1s! You have <b>%2s! You have <b>%2d new messages</b>.</string> </resources> |
在这个格式化字符串里,加入了一个<b>元素。注意左尖括号是用标记<转义过的HTML。
2. 然后,按照通常方式格式化字符串,并调用fromHtml(String) 把HTML文本转换成带样式的文本。
Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username,mailCount); CharSequence styledText = Html.fromHtml(text); |
因为fromHtml(String)方法会格式化所有的HTML内容,所以要确保用htmlEncode(String)对带格式化文本的字符串内所有可能的HTML字符进行转义。比如,如果要把可能包含诸如“<”或“&”等字符的串作为参数传给String.format(),那么必须在格式化之前对这些字符进行转义。格式化后,再把字符串传入fromHtml(String),这些特殊字符就能还原成本来意义了。例如:
String escapedUsername = TextUtil.htmlEncode(username) Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages),escapedUsername, mailCount); CharSequence styledText = Html.fromHtml(text); |
你所不知道的string.xml的更多相关文章
- Android中Context详解 ---- 你所不知道的Context
转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好, ...
- Android Context完全解析,你所不知道的Context的各种细节
Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了.但是这并不代表Context没有什么东西好讲的,实际上Context有太多小的细节并不被大家所关注,那么今天我们就来学 ...
- Android中Context详解 ---- 你所不知道的Context(转)
Android中Context详解 ---- 你所不知道的Context(转) 本文出处 :http://b ...
- 你所不知道的linq(二)
上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...
- 你所不知道的五件事情--java.util.concurrent(第二部分)
这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,仍然讲述了关于Java并发集合API的一些应用窍门,值得大家学习.(2010.06.17最后更新) 摘 ...
- JavaScript中你所不知道的Object(二)--Function篇
上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...
- js值----你所不知道的JavaScript系列(6)
1.数组 在 JavaScript 中,数组可以容纳任何类型的值,可以是字符串.数字.对象(object),甚至是其他数组(多维数组就是通过这种方式来实现的) .----<你所不知道的JavaS ...
- js类型----你所不知道的JavaScript系列(5)
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型等. 1.内置类型 JavaScript 有七种内置类型: • 空值(null) • 未定义( ...
- 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例
你所不知道的 CSS 阴影技巧与细节 关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow ...
随机推荐
- mysql安全
安装MySql时,尽量选择别的端口(默认是3306),密码设复杂一点!在next的步骤中,注意不要选中"允许远程登录". Web漏洞检测及修复 http://wiki.open.q ...
- UDP通信 Java
public class UdpServerTest { /** * @param args * @throws SocketException */ public static void main( ...
- transform3D实现翻页效果
---恢复内容开始--- 闲篇 最近升级了下百度音乐,唯一的感觉就是动画效果很炫丽.我不是个对产品很敏感的人,但是这段时间观察一些大厂的产品发现现在的APP越来越重视动画效果了.大家可能没有注意过,连 ...
- 第二章 Qt常用工具的介绍
第二章 Qt常用工具的介绍 (1)No.1 qmake 相信编写过Makefile的开发人员,随着工程中源码的级数递增和以类型.功能.模块组织源码的子目录的增多,都不愿意重复机械地手工编写这个工程管理 ...
- 百度地图LBS应用开发代码
最近因为工作需要,领导要我将51地图API开发的一个应用迁移到百度地图,或者说用百度地图API进行重写,实现同样的功能.我先是把现有的这个51地图的应用了解了一下,然后就试着用百度地图做一些demo, ...
- PHP上传文件大小限制问题 post_max_size对大小的影响及解决方法
今天在操作php上传的时候发现了一个问题,就是当php脚步上传的文件大小超过php.ini中post_max_size的限制的时候页面不会给出提醒,文件也上传失败,这个问题感觉应该算是一个另类,今天跟 ...
- 前端资源多个产品整站一键打包&包版本管理(三)—— gulp分流
问题: 当我们一个工作台里面有好几个项目的时候,我们要为项目的前端资源进行打包,但是,gulpfile只有一个,如果我们把所有的打包都放在同一个文件里面,首先文件会越来越大,而且不便于管理,这时,我们 ...
- centos6.5 mysql配置整理
安装 // 安装mysql yum -y install mysql-server //设置开机启动 chkconfig mysqld on //启动MySql服务 service mysqld st ...
- 2014年度辛星css教程夏季版第六节
这一节我们就要讲到布局了,其实布局本身特别简单,但是要合理的布好局就不那么简单了,就像我们写文章一样,写一篇文章非常简单,但是要写一篇名著就很难了,这需要我们扎实的功底和对文学的理解,但是,千里之行, ...
- Sybase数据库异常紧急恢复
现象:Error 926 Severity Level 14 Error Message Text Database 'xx' cannot be opened - it has been ma ...