您的位置:首页 > 移动开发 > Android开发

FAQ_17 android string.xml 里面的 %

2012-02-17 21:06 190 查看
有这样一种情形,不知道你是否遇到过。

我们要将 android 资源国际化,但是有时候还需要动态的改变字符串的内容,你不可能把所有的情况都写到 string.xml

里面,那怎么办?

假设,现在我们做了一款 app,但是检测到有些设备不支持我们 app 的某些功能,这个时候你需要提示用户:

您的手机暂时没有 ×× ,暂时您无法使用我们的该项功能!

解决这个问题,android 为我们提供了方便的方式:可以使用 xliff 或者不使用 xliff.

Xliff 是 XML Localization Interchange File Format 的缩写,中文名为 XML 本地化数据交换格式。

还是举几个例子吧,直接简单的说明问题。

1.  不使用 xliff

在 res/values/string.xml:

<string name="info">i am is %1$d ,and myname is %2$s</string>

在代码中:

Context mContext;

String info = mContext.getResources().getString(R.string.info, 10, "mark");

输出信息:i am is 10 ,and myname is mark

可以看出,%1$d 被 10 替代,%2$s 被 mark 替代。此时你会问,为什么要标注1、2,如果都写 1,会怎么样?

测试发现,写 1 那麽输出信息为:i am is 10 ,and myname is 10.

想更加深入的了解这个问题,可以参考 getString 源码。

 public String getString(int id, Object...
formatArgs) throws NotFoundException {

        String raw = getString(id);

        return String.format(mConfiguration.locale, raw, formatArgs);

  }

其中,Object... formatArgs 表示一种数据类型形式,可以参考:

http://blog.csdn.net/androidbluetooth/article/details/6593632

2.  使用 xliff

在 res/values/string.xml:

<?xml version="1.0" encoding="utf-8"?>

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

<string name="info">i am is <xliff:g>%1$d</xliff:g> ,and myname is <xliff:g>%2$s</xliff:g></string>

</resources>

注意:xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" 要声明。

然后在代码中,可以像上面那样去使用了。效果一样的。

如果想更加人性化一点,可以这样写:

<string name="info">i am is <xliff:g id="age" example="20">%1$d</xliff:g>,
and myname is <xliff:g id="name", example="jhon">%2$s</xliff:g></string>

id、example 只是表示说明。

那么,% 默认是格式化字符串的,如果想在 string.xml 里面使用 % 怎么办?

解决办法

1. 用%%来表示 1 个%,不要使用转意符号 \ ,没有作用!

<string name="value_perc">30%%</string>

2. 增加属性:formatted="false"

<string name="value_perc"
formatted="false">30%</string>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: