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.
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:
%d
ou le format dont vous avez besoin%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