2017-01-31 4 views
2

私は取得していますエラーがAndroid数量文字列(複数形)の使い方は?

私は

以下のように複数形を設定
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 

あるAndroidデベロッパーガイドラインQuantity String (Plurals)

に基づく数量文字列(複数形)を取得するために、リソースのgetQuantityStringメソッドを使用しようとしています

<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つの部分を連結することです。しかし、私は可能ならばそれを避けようとしています。

答えて

13

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

  1. リソース文字列がプレーンテキストで、リソース文字列が一つのパラメータのみ(最も可能性が高い量)が含まれてい
  2. 任意のパラメータが含まれていません。 %dまたは必要な形式を使用してください
  3. リソース文字列には複数のパラメータが含まれています。追加Object... formatArgsパラメータを使用してのみressource ID及び数量を有するものと、1:全てのパラメータが明示的に例えばgetQuantityString方法として%1$d

ため、それらの位置によってアクセスされなければならない、2つのオーバーロードがあります。

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

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

<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へappropiateの呼び出しは、次のとおりです。

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 
関連する問題