前言
此篇讲解Android项目资源文件夹(res)下strings.xml资源文件的种类和使用。在实际开发过程中,字符串资源是使用的非常频繁的一种资源类型,所以今天打算单独以一篇博客的形式记录下来-----总结字符串的各种类型的使用方式。
字符串资源在Android项目中位置:res/values/strings.xml。其中strings.xml系统默认是叫这个名字,当然你也可以随便取名。比如names.xml也是可以的。
一、字符串资源种类
String | 一条字符串。 例如“Hello World”就是一个String资源。 |
String Array | 一组字符串。就是一个字符串数组。 例如{“LiSi”,“ZhangSan”,“WangWu”}。 |
Quantity Strings(Plurals) | 复数型字符串(注:英语中的复数,不是数学中的复数)。 例如bikes为bike的复数。 |
下面单独就每一个类型的字符串资源进行详细说明,以及字符串的国际化处理。
二、String字符串
1、语法格式
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="string_name">text_string</string>
</resources>
说明:
<resources>标签必须是根标签。
<string>标签定义一条字符串。 属性name为字符串的名称,通过名称找到对应的字符串。在Java代码中用R.string.string_name获取字符串,在XML中用@string/string_name 获取字符串。
2、字符串格式化
在Java代码中,我们可以使用String.format方法来进行字符串格式化。但是在XML资源文件中,怎么格式化呢,这也是接下来要讲解的内容。
例如:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
其中%1$s的含义:1$表示位置1,%s表示字符串,也就是位置1的地方是一个字符串参数;同理,%d表示一个整数,%2$d表示位置2的地方需要放置一个整数类型的参数。
Java代码中的使用:
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount<span style="font-family: Arial, Helvetica, sans-serif;">);</span>
或者
getString(R.string.welcome_messages, username,mailCount);
至于更多的数据类型格式如下:
%s | 字符串类型 |
%c | 字符类型 |
%b | 布尔类型 |
%d | 整数类型(十进制) |
%x | 整数类型(十六进制) |
%o | 整数类型(八进制) |
%f | 浮点类型 |
%a | 十六进制浮点类型 |
%e | 指数类型 |
%g | 通用浮点类型 (f和e类型中较短的) |
%h | 散列码 |
%% | 百分比类型 |
%n | 换行符 |
%tx | 日期与时间类型 (x代表不同的日期 与时间转换符) |
3、字符串的样式--HTML标签的使用
比如需要一个带下划线的文本,作为一个纯Android开发人员,做起来可能比较麻烦。但是对于Web工程师来说应该是很容易的--------直接使用<u>标签标注下划线文本。
我们来看看怎么在Android中也使用<u>标签,如果能使用,真的是解决了一些麻烦。
例子1:
this is
a bike
代码:
<string name="string01">this is <u>a bike</u></string>
Java中使用的代码如下:
textView1.setText(getText(R.string.string01));
或者:
textView1.setText(Html.fromHtml(getString(R.string.string01)));
例子2:
<resources>
<string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string>
</resources>
java中使用的代码如下:
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
CharSequence styledText = Html.fromHtml(text);
如果在使用过程中<>符号出现异常,可以使用 <和>代替。
三、String Array字符串数组
这是一个String的数组。数组中的String对象拥有上面描述的String的所有功能和效果。
1、语法格式
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array
name="string_array_name">
<item
>text_string</item>
</string-array>
</resources>
说明:
<string-array>标签表示的一组字符串,包含一个或者多个String字符串对象。属性name为字符数组的名称,通过名称找到此数组对象。
很简单,就不多说。我们还是来看看例子。
例子:
res/values/arrays.xml
<string-array name="spinner_item">
<item>bus</item>
<item>bike</item>
<item>car</item>
</string-array>
res/layout/main_activity.xml
<Spinner
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
src/packagename/main.java
spinner = (Spinner) findViewById(R.id.spinner1);
String[] items = getResources().getStringArray(R.array.spinner_item);//此处获得就是一个String数组
spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items));
效果:
或者
res/values/arrays.xml:请注意下面的“bike”加入下划线的数据。
<string name="string02"><u>bike</u></string>
<string-array name="spinner_item">
<item>bus</item>
<item>@string/string02</item>
<item>car</item>
</string-array>
java代码中使用如下:(注意:下面使用的是getTextArray)
CharSequence[] items = getResources().getTextArray(R.array.spinner_item);
spinner.setAdapter(new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, items));
效果:(其中bike是有下划线的)
说明:getString和getText方法、getStringArray和getTextArray;其中getTextArray和getText都是处理富文本的方法,也就是说会自动处理Html标签文本。而getString和getStringArray是会忽略HTML标签。
这就是String Array的用法,很简单。同时也具备String的格式化效果和HTML样式效果。
四、Quantity Strings(Plurals)复数型字符串
量化字符串,或者话复数字符串。比如一条鱼,两条鱼用英文描述就是one fish,two fishes。那在处理这样的字符串的时候,只有一个数字和量词不一样,其他内同全部相同的情况下。我们可以使用Quantity Strings字符串类型进行处理。而不必要用if else来判断。
注意:
Quantity String类型基本都是使用在国际化处理的时候使用的比较多。如果是一个纯中文的应用,Quantity String就显得有点多余了。因为中文中一条鱼、和两条鱼。其中就是数字变量,并没有像英文那样fish和fishes的区别。所以接下来我们的例子,需要手机的环境是英文语言环境。
1、语法格式
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals
name="plural_name">
<item
quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
>text_string</item>
</plurals>
</resources>
说明:
其中<plurals>标签就不多说了。
重点说一下ITem标签中的
quantity属性。此属性的取值如下:
以下就是quantity属性的全部取值。有一点需要说明的是,这些值不是在所有情况下都有用。比如英文中比较特殊的就是one(one bike\one fish),其他的所有数字全部都可以作为other处理(zero fishes\two fishes等)。
zero | 0,在阿拉伯语言中,0作为量词需要特殊处理。 |
one | 在英文和大多数其他语言中需要特殊处理这个量词 |
two | 在威尔士语言对这个量词需要特殊处理 |
few | 波兰语言中需要特殊用到few量词。 |
many | 马耳他语言中需要特殊处理many这个量词 |
other | 其他全部不需要特殊处理的情况 |
我之前做国际化处理的时候,翻译会帮我们翻译好各国语言。特殊的情况需要特殊的处理。使用Quantity String就方便很多。当你们正在处理国际化的时候,估计是很有感触的。很多都是细节而繁琐的工作,一点点小优化可能就节省了你很多时间。
同时也可以使用String的格式化效果和HTML样式效果。
例子:
res/values/strings.xml
<plurals name="plurals_demo">
<item quantity="other">%d bikes</item>
<item quantity="one">%d bike</item>
</plurals>
layout/main.xml代码:
<TextView
android:id="@+id/text01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<SeekBar
android:id="@+id/seekBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="5"/>
Java中的代码:
//其中第一个progress是对应<item>标签中的quantity这个属性,第2个progress是显示在屏幕上的数字。
textView1.setText(getResources().getQuantityString(R.plurals.plurals_demo, progress, progress));
效果:
上面这个效果需要把手机语言换成英文。在中文环境下,是不会有任何变化的。
五、国际化处理
此处简单介绍一下Android中国际化处理。
对res/values文件夹名称做一下处理,比如中文国际化就是res/
values-zh-rCN/strings.xml.
就是在文件夹名称后面以”-“连接国家简称。
如下图:
六、总结
这些资源文件的使用真的是不难,难在一些细节需要知道。这样在工作时就可以多节省点时间。
做过国际化的同学应该知道,国际化是一件让人吐血的工作。多了解一些关于String的特性,可以在关键时候起到大作用。