Android XML字符串资源文件详细讲解

前言

此篇讲解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);

如果在使用过程中<>符号出现异常,可以使用 &lt;和&gt;代替。

三、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等)。

zero0,在阿拉伯语言中,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的特性,可以在关键时候起到大作用。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨景文Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值