web-dev-qa-db-fra.com

Comment utiliser Android chaînes de quantité (pluriels)?

J'essaie d'utiliser getQuantityString méthode dans les ressources pour récupérer des chaînes de quantité (pluriels) en fonction de Android directives du développeur chaîne de quantité (pluriels)

L'erreur que je reçois est

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

quand je mets en place des pluriels comme ci-dessous

<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>

et en essayant de le lire comme ci-dessous

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

Une solution consiste à décomposer la chaîne pour utiliser le pluriel uniquement pour la dernière partie de la chaîne et à concaténer les deux parties. Mais j'essaie d'éviter cela si possible.

21
Andy

Vous n'avez pas besoin de définir l'attribut "formaté" pour aucun de ces éléments. Lorsque vous utilisez des chaînes de quantité, il n'y a que trois possibilités:

  1. la chaîne de ressource est en texte brut et ne contient aucun paramètre
  2. la chaîne de ressources ne contient qu'un seul paramètre (probablement la quantité); utilisez %d ou le format dont vous avez besoin
  3. la chaîne de ressource contient plusieurs paramètres; tous les paramètres doivent être explicitement accessibles par leur position, par exemple %1$d

Quant à la méthode getQuantityString, il y a deux surcharges: une avec uniquement l'identifiant de la ressource et la quantité, et une avec un paramètre supplémentaire Object... formatArgs.

Pour le cas 1., vous pouvez utiliser la méthode getQuantityString(@PluralsRes int id, int quantity).

Pour tous les autres cas, i. e. si vous avez des paramètres, vous avez besoin de la surcharge getQuantityString(@PluralsRes int id, int quantity, Object... formatArgs). Remarque: tous les paramètres doivent être présents dans le tableau des paramètres. Cela signifie que si la chaîne de ressource affiche la quantité, la variable de quantité sera transmise deux fois à la fonction.

Donc, si ce sont vos ressources

<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>

alors les appels appropriés à getQuantityString sont:

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
62
LWChris