6

我正在使用 android-sdk 提供的复数字符串。我使用以下代码创建了一个复数字符串:

 <plurals name="valuestr">
        <item quantity="zero">Choose a value.</item>
        <item quantity="one">%d unit.</item>
        <item quantity="other">%d units.</item>
    </plurals>

Java 代码:

textView.setText(getResources().getQuantityString(R.plurals.valuestr,0,0));

当我设置“0”以外的任何值时,这工作正常,但是当我设置“0”时,它显示“0 单位”。.

请帮忙!

更新

在互联网上搜索更多内容时,我遇到了一个使用java.text.MessageFormat类的解决方法:

<resources>
    <string name="item_shop">{0,choice,0#No items|1#One item|1&lt;{0} items}</string>
</resources>

然后,从代码中您所要做的就是:

String fmt = resources.getText(R.string.item_shop);
textView.setText(MessageFormat.format(fmt, amount));

您可以在MessageFormat 的 javadocs 中阅读有关格式字符串的更多信息

4

2 回答 2

8

最近在 G+ 上发布了一篇关于此的帖子。简而言之,这是因为这不会选择最接近的匹配整数(0 = 零),而是因为它会寻找最佳的语法选择。

在您的示例中,您使用单位。正确的用法是;0 个单位 1 个单位 2 个单位

使,零几乎等于任何其他大于 1 的数量

在这里阅读全文; https://plus.google.com/116539451797396019960/posts/VYcxa1jUGNo

于 2013-04-05T09:12:57.247 回答
0

在资源文件部分中定义的<plurals>复数仅用于区分单数/复数字符串的语法。您不应像以前那样将它们用于其他显示逻辑。您应该在代码中添加一些检查逻辑。

Android 开发者指南清楚地说明了这一点:

虽然历史上称为“数量字符串”(在 API 中仍然称为),但数量字符串只能用于复数。例如,当有未读邮件时,使用数量字符串来实现诸如 Gmail 的“收件箱”与“收件箱 (12)”之类的东西是错误的。使用数量字符串而不是 if 语句似乎很方便,但重要的是要注意某些语言(例如中文)根本不区分这些语法,因此您总是会得到另一个字符串。

在我看来,您的解决方法 - 尽管在技术上适用于您当前的实施 - 看起来也不是一个干净的解决方案。未来的业务需求可能需要包含更复杂的逻辑,而不仅仅是显示不同的文本。或者,您的资源文件中可能有一个通用的“未选择项目”字符串,用于不同的位置,只有在您不坚持解决方案时才能重复使用。

通常,我会避免使用两种不同的格式化技术(String.format 样式格式化程序%d与 MessageFormat 样式格式化程序{0},并选择一种您会在整个应用程序中坚持使用的格式化技术。

于 2015-10-18T01:21:57.610 回答