必须为每组plurals至少定义other条目,否则传入未匹配quantity时返回空字符串;quantity值需为整数,小数负数会取整匹配,且other是必填兜底项。

plurals.xml 里 quantity 值写错会导致字符串完全不显示
Android 的 plurals 不是“自动判断单复数”,而是靠你传入的整数去匹配预设的 quantity 类型(如 one、other)。如果传了小数、负数或非整数,系统直接 fallback 到 other;但如果你压根没定义 other,就返回空字符串——界面看起来像“丢了文字”。
常见错误现象:getQuantityString(R.plurals.item_count, 1, 1) 显示空白,其实是因为 item_count 的 plurals 只写了 one 和 two,漏了 other。
- 必须为每组
plurals至少定义一个other条目,它是兜底项 -
zero、one、two、few、many、other是 Android 定义的合法quantity值,不能写plural或singular - 传入值会被强制取整(
Math.round()),所以getQuantityString(..., 1.8, 1.8)实际按2匹配
Java/Kotlin 调用 getQuantityString 时参数顺序和类型要严格对应
这个函数签名看着简单,但第二、第三个参数含义容易混淆:getQuantityString(int id, int quantity, Object... formatArgs)。第二个参数是用于匹配 quantity 类型的整数,不是格式化参数;第三个才是可变参数,用来替换字符串里的 %d 或 %s。
使用场景:显示 “删除了 3 个项目” 这类带数字和复数变化的提示。
- 错误写法:
context.resources.getQuantityString(R.plurals.deleted_items, 3, "3")→ 把数字同时当匹配值和格式值,结果可能多出一个 "3" - 正确写法:
context.resources.getQuantityString(R.plurals.deleted_items, 3, 3),第一个3决定选few还是other,第二个3填进%d - Kotlin 中注意:如果只传一个格式参数,不要加
arrayOf(...),直接写值;否则会把整个数组当一个Object传进去,导致%d解析失败
多语言下 few/many 等规则因语种而异,不能靠中文习惯推测
中文只有 one 和 other 之分,但波兰语要区分 one、few、many、other;阿拉伯语甚至有 6 种规则。你写的 plurals.xml 在 values-pl/ 下必须按波兰语规则补全所有必要 quantity,否则运行时在波兰设备上仍可能 fallback 到 other 或崩溃。
性能影响:没有额外开销,但缺失语种专属条目会导致文案不准确,用户感知比性能问题更严重。
- 查目标语言需要哪些
quantity:看 Android 源码里的android.icu.text.PluralRules,或直接查 CLDR 数据库(比如搜索 “Polish plural rules”) - 捷克语中
1是one,2–4是few,5+是other;所以values-cs/plurals.xml必须包含这三类,缺一不可 - 英文只需
one+other;但如果你在values-en/里只写了other,那1 item就永远显示成1 items
动态数量变化时别反复调用 getQuantityString,尤其在 RecyclerView 里
每次调用 getQuantityString 都会解析 XML、查找匹配项、做字符串格式化。在列表滚动或频繁更新的场景下,它可能成为小瓶颈,特别是配合多语言 + 多格式参数时。
容易踩的坑:在 onBindViewHolder 里对每个 item 都调一次 getQuantityString(R.plurals.x, count, count),而 count 其实是固定值或变化极少。
- 如果数量不变,提前算好字符串,缓存到 ViewHolder 或 ViewModel 里
- 如果只是开关式变化(比如“0 个” / “1+ 个”),用布尔状态 + 两个静态字符串更轻量
- 避免在
TextWatcher或动画帧回调里高频调用;先做防抖,再取值
plurals 条目,而是上线后发现某小语种用户反馈“删了 1 个却显示 1 个s”,翻日志才发现那个语种的 values-xx/ 目录下压根没放 plurals.xml。










