FAQ_17 android string.xml 里面的 %

有这样一种情形,不知道你是否遇到过。

我们要将 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>




©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页