如何使用Android数量字符串(复数)?

时间:2017-01-31 06:23:09

标签: android string android-resources plural

我尝试在参考资料中使用getQuantityString 方法根据Android开发人员指南Quantity String (Plurals)

检索数量字符串(Plurals)

我得到的错误是

Error:(604) Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?
Error:(604) Found tag </item> where </plurals> is expected

当我设置复数时如下

<plurals name="productCount">
    <item quantity="one" formatted="true">%1$d of %2$d product</item>
    <item quantity="other" formatted="true">%1$d of %2$d products</item>
</plurals>

并尝试按以下方式阅读

productIndexCountText.setText(getResources().getQuantityString(R.plurals.productCount, position, size));

一种解决方法是将字符串分解为仅对字符串的最后部分使用复数并连接这两部分。但是我尽量避免这样做。

1 个答案:

答案 0 :(得分:53)

您不需要设置&#34;格式化的&#34;任何这些项目的属性。使用数量字符串时,只有三种可能性:

  1. 资源字符串是纯文本,不包含任何参数
  2. 资源字符串只包含一个参数(很可能是数量);使用%d或您需要的任何格式
  3. 资源字符串包含多个参数;所有参数都必须按其位置显式访问,例如%1$d
  4. 对于getQuantityString方法,有两个重载:一个只包含资源ID和数量,另一个包含额外的Object... formatArgs参数。

    对于案例1.,您可以使用getQuantityString(@PluralsRes int id, int quantity)方法。

    对于所有其他情况,我。即如果您有任何参数,则需要getQuantityString(@PluralsRes int id, int quantity, Object... formatArgs)重载。注意:所有参数必须存在于param数组中。这意味着,如果资源字符串显示数量,则数量变量将两次传递给函数。

    所以如果这些是你的资源

    <resources>
        <plurals name="test0">
            <item quantity="one">Test ok</item>
            <item quantity="other">Tests ok</item>
        </plurals>
        <plurals name="test1">
            <item quantity="one">%d test ok</item>
            <item quantity="other">%d tests ok</item>
        </plurals>
        <plurals name="test2">
            <item quantity="one">%2$s: %1$d test ok</item>
            <item quantity="other">%2$s: %1$d tests ok</item>
        </plurals>
        <plurals name="test3">
            <item quantity="one">%3$s: %1$d test out of %2$d ok</item>
            <item quantity="other">%3$s: %1$d tests out of %2$d ok</item>
        </plurals>
    </resources>
    

    然后对getQuantityString的适当调用是:

    int success = 1;
    int total = 10;
    String group = "Group name";
    
    getResources().getQuantityString(R.plurals.test0, success)
    // Test ok
    getResources().getQuantityString(R.plurals.test1, success, success)
    // 1 test ok
    getResources().getQuantityString(R.plurals.test2, success, success, group)
    // Group name: 1 test ok
    getResources().getQuantityString(R.plurals.test3, success, success, total, group)
    // Group name: 1 test out of 10 ok
    
    success = 5;
    getResources().getQuantityString(R.plurals.test0, success)
    // Tests ok
    getResources().getQuantityString(R.plurals.test1, success, success)
    // 5 tests ok
    getResources().getQuantityString(R.plurals.test2, success, success, group)
    // Group name: 5 tests ok
    getResources().getQuantityString(R.plurals.test3, success, success, total, group)
    // Group name: 5 tests out of 10 ok