我想使用复数形式支持多种语言:
<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)
我有什么遗失的吗?字符串数组甚至支持复数吗?
答案 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,布局。您甚至可以拥有数组数组。