web-dev-qa-db-ja.com

Android数量文字列(複数)を使用するには?

リソースで getQuantityString メソッドを使用して、Android開発者ガイドライン Quantity String(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つの回避策は、文字列の最後の部分にのみ複数形を使用するように文字列を分割し、2つの部分を連結することです。しかし、可能であれば、それを避けようとしています。

21
Andy

これらのアイテムのいずれにも「フォーマット済み」属性を設定する必要はありません。数量文字列を使用する場合、3つの可能性のみがあります。

  1. リソース文字列はプレーンテキストであり、パラメーターは含まれていません
  2. リソース文字列に含まれるパラメーターは1つだけです(ほとんどの場合、数量)。 _%d_または必要な形式を使用します
  3. リソース文字列には複数のパラメーターが含まれています。すべてのパラメータは、_%1$d_など、位置によって明示的にアクセスする必要があります

getQuantityStringメソッドに関しては、2つのオーバーロードがあります。1つはressource idと数量のみ、もう1つは追加の_Object... formatArgs_パラメーターです。

ケース1.の場合、getQuantityString(@PluralsRes int id, int quantity)メソッドを使用できます。

他のすべての場合、i。 e。パラメータがある場合は、getQuantityString(@PluralsRes int id, int quantity, Object... formatArgs)オーバーロードが必要です。注:allパラメーターはparam配列に存在する必要があります。つまり、リソース文字列が数量を表示する場合、数量変数は関数に渡されますtwice

これらがあなたのリソースなら

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