android plurals用法(单复数)

android plurals用法(单复数)rule select 根据规则 得到 quantity 对应的 QuanitiyCode 即 zero one other 等

Value

zero 当语言需要特别对待0时(就想阿拉伯)

one 当语言需要特别对待1(就像英语里和其他语言里的1;在russian,任何以1结尾但是不是以11结尾的也使用这种情况)

two 当语言需要特别对待1(例如Welsh的2,或者Slovenian的102)

few 当语言需要特别对待small(例如Czech的2,3,4;或者以2,3,4结尾但是不是12,13,14的Polisth)

many 当语言需要特别对待large(例如Maltese的11-99)

other 当语言没有要求对特定资

实例:

%d book

%d books

代码:

String bookNum = getResources().getQuantityString(R.plurals.book_number, 1, 2);

tv4.setText(bookNum);

String bookNum2 = getResources().getQuantityString(R.plurals.book_number, 2, 4);

tv5.setText(bookNum2);

注意:一定要在English语言环境下才起作用,语言为中文不起效。

当第二个参数为1时,会调用 book,为其他数值时,会调用books。

为什么只在英文语言环境下才起作用呢?

2、源码分析

======

@NonNull

public String getQuantityString(@PluralsRes int id, int quantity, Object… formatArgs)

throws NotFoundException {

//容易看出,先根据quantity决定要使用的字符串

String raw = getQuantityText(id, quantity).toString();

//再进行占位符的替换工作

return String.format(mResourcesImpl.getConfiguration().getLocales().get(0), raw,

formatArgs);

}

@NonNull

public CharSequence getQuantityText(@PluralsRes int id, int quantity)

throws NotFoundException {

//依赖于ResourceImpl的实现

return mResourcesImpl.getQuantityText(id, quantity);

}

跟进ResourceImpl中的getQuantityText函数:

CharSequence getQuantityText(@PluralsRes int id, int quantity) throws NotFoundException {

//得到规则

PluralRules rule = getPluralRule();

//rule.select根据规则,得到quantity对应的QuanitiyCode,即"zero"、“one”、"other"等

//之后再根据QuanitiyCode,的到具体的资源文件

CharSequence res = mAssets.getResourceBagText(id,

attrForQuantityCode(rule.select(quantity)));

if (res != null) {

return res;

}

//rule没能找到对应的QuanitiyCode时,就用"other"字段的定义

res = mAssets.getResourceBagText(id, ID_OTHER);

if (res != null) {

return res;

}

//上面寻找资源文件出问题,就抛出异常

throw new NotFoundException(“Plural resource ID #0x” + Integer.toHexString(id)

  • " quantity=" + quantity
  • " item=" + rule.select(quantity));

}

这里我们首先看一下getPluralRule函数:

private PluralRules getPluralRule() {

synchronized (sSync) {

if (mPluralRule == null) {

//单例模式,且和本地化有关,以Locales的第一个配置来初始化规则

mPluralRule = PluralRules.forLocale(mConfiguration.getLocales().get(0));

}

return mPluralRule;

}

}

PluralRules的select函数对应的底层实现,在此不作深研究,不同的Locales应该有不同的实现。

在此看看attrForQuantityCode:

今天的文章 android plurals用法(单复数)分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-01-02 16:33
下一篇 2025-01-02 16:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/99579.html