如何使用复数的字符串数组?

时间:2014-05-21 03:52:30

标签: android arrays android-resources

我想使用复数形式支持多种语言:

<string-array name="quantityTypes">
    <item>@plurals/Package</item>
    <item>@plurals/Piece</item>
</string-array>

<plurals name="Package">
    <item quantity="one">"Package"</item>
    <item quantity="other">"Packages"</item>
</plurals>
<plurals name="Piece">
    <item quantity="one">"Piece"</item>
    <item quantity="other">"Pieces"</item>
</plurals>

我正在尝试获取字符串数组,但此调用返回一个包含2个元素的字符串数组,这两个元素都为null。

getResources().getStringArray(R.array.quantityTypes)

我有什么遗失的吗?字符串数组甚至支持复数吗?

3 个答案:

答案 0 :(得分:0)

对我来说,getResources().getStringArray(R.array.quantityTypes)也返回一个空数组。似乎Android仍然不支持它。

但是我找到了一个看起来更好的解决方法(无需检查数组边界):

// strings.xml

<plurals name="Season">
    <item quantity="one">"Season"</item>
    <item quantity="other">"Seasons"</item>
</plurals>
<plurals name="Volume">
    <item quantity="one">"Volume"</item>
    <item quantity="other">"Volumes"</item>
</plurals>
<plurals name="Collection">
    <item quantity="one">"Collection"</item>
    <item quantity="other">"Collections"</item>
</plurals>
<plurals name="Special">
    <item quantity="one">"Special"</item>
    <item quantity="other">"Specials"</item>
</plurals>
<plurals name="Set">
   <item quantity="one">"Set"</item>
   <item quantity="other">"Sets"</item>
</plurals>

// ShowTypes.java

public enum ShowTypes {
    SEASON("Season", R.plurals.Season),
    VOLUME("Volume", R.plurals.Volume),
    COLLECTION("Collection", R.plurals.Collection),
    SPECIAL("Special", R.plurals.Special),
    SET("Set", R.plurals.Set)

    private String typeValue;
    private int resId;

    private ShowTypes(String typeValue, int resId) {
        this.typeValue = typeValue;
        this.resId = resId;
    }

    public static ShowTypes getType(String typeValue) {
        ShowTypes result = SEASON;
        for (ShowTypes type : ShowTypes.values()) {
            if (type.typeValue.equals(typeValue)) {
                return type;
            }
        }
        return result;
    }

    public String getResourceString(Resources res, int quantity) {
        return res.getQuantityString(resId, quantity);
    }
}

答案 1 :(得分:0)

您没有注意到<plurals>包含多个值:

<plurals name="plurals_1">
    <item quantity="zero">нет котов</item>
    <item quantity="one">%1$d кот</item>
    <item quantity="two">%1$d кота</item>
    <item quantity="few">%1$d кота</item>
    <item quantity="many">%1$d котов</item>
    <item quantity="other">%1$d котов</item>
</plurals>

int i = 33;
String value = getResources().getQuantityString(R.plurals.plurals_1, i, i);

这对非英语语言很重要。

答案 2 :(得分:-1)

这肯定是可能的。首先,您需要将资源数组定义为整数数组,而不是字符串数组,因为复数是资源ID,而不是字符串。

<integer-array name="quantities">
    <item>@plurals/quantity_1</item>
    <item>@plurals/quantity_2</item>
    <item>@plurals/quantity_3</item>
</integer-array>

然后您可以像这样解析数量:

val quantity = 1  // This is the quantity plurals are resolved for.
val ta = resources.obtainTypedArray(R.array.quantities)
val quantitiesArray = Array(ta.length()) {
    resources.getQuantityString(ta.getResourceId(it, 0), quantity)
}
ta.recycle()

实际上,您可以使用大多数资源类型执行此操作:可绘制对象,ID,布局。您甚至可以拥有数组数组。