Ответ 1
Вы должны установить его по коду:
...setText(yourContext.getResources().getQuantityString(R.plurals.cats, catsCountVar));
Я использую Plurals, чтобы упростить мой код. например, у меня было
<string name="cat">Cat</string>
<string name="cats">Cats</string>
Используя Plurals вместо нескольких строк, теперь у меня есть
<plurals name="cats">
<item quantity="one">Cat</item>
<item quantity="other">Cats</item>
</plurals>
Однако я использовал для извлечения строк для использования в качестве заголовков или резюме в моем XML. например.
android:title="@string/cats"
Удалив эту строку в пользу множественного числа, я теперь не уверен, как извлечь мою строку из XML. Я сделал наивную попытку с помощью
android:title="@plurals/cats"
но это просто дает мне @1234567890
вместо Cats
(или Cat
).
Кто-нибудь знает, можно ли извлечь строку из Плюрали из XML?
Вы должны установить его по коду:
...setText(yourContext.getResources().getQuantityString(R.plurals.cats, catsCountVar));
Вы можете пользоваться преимуществами Plurals во время выполнения и статическими преимуществами строковых ресурсов, оставляя строковые ресурсы там, где они есть, и ссылаясь на них во множественных ресурсах.
От https://developer.android.com/guide/topics/resources/string-resource.html#Plurals (выделение добавлено).
<item>
Множественное число или единственная строка. Значение может быть ссылкой на другой строковый ресурс. Должен быть дочерним элементом элемента. Помните, что вы должны избегать апострофов и кавычек. См. форматирование и стилизация ниже для получения информации о том, как правильно стилизовать и отформатировать ваши строки. Пример:
<string name="cat">Cat</string>
<string name="cats">Cats</string>
<plurals name="cats">
<item quantity="one">@string/cat</item>
<item quantity="other">@string/cats</item>
</plurals>
Теперь вы можете использовать android:title="@string/cats"
в файлах XML, а также использовать
getQuantityString(R.plurals.cats, numberOfCats)
во время выполнения.
Если ваша строка включает в себя форматирование строки с номером, то вам нужно дважды отправить целочисленную переменную, например
strings.xml
<resources>
<plurals name="numberOfMinute">
<item quantity="one">%d minute</item>
<item quantity="other">%d minutes</item>
</plurals>
</resources>
в Java
int min = getNumberOfMinute();
Resources res = getResources();
String formattedStr = res.getQuantityString(
R.plurals.numberOfMinute,
min,
min
); //this will return "20 minutes" or "1 minute" depending on variable
Kotlin File
resources.getQuantityString(
R.plurals.numberOfMinute, //plural from strings.xml file
min, //quantity
min //var arg
)
Вот способ использования множественного ресурса в качестве атрибута вашего пользовательского представления.
SRC/Основной /RES/XML/layout.xml
<com.mypackage.MyView
app:foo="@plurals/cats"/>
SRC/основные /RES/значения /attrs.xml
<resources>
<declare-styleable name="MyView">
<attr name="foo"/>
</declare-styleable>
</resources>
MyView.java
public class MyView extends View {
private int fooResId;
private int quantity;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);
fooResId = a.getResourceId(R.styleable.MyView_foo, 0);
a.recycle();
}
// this will return "Cat" or "Cats" depending on the value of quantity
private String getFooString() {
return getContext().getResources().getQuantityString(fooResId, quantity);
}
}
обновленный ответ для Kotlin
strings.xml
<plurals name="lbl_items_selected">
<item quantity="one">%d item Selected</item>
<item quantity="other">%d items Selected</item>
</plurals>
Kotlin File
resources.getQuantityString(
R.plurals.lbl_items_selected, //plural from strings.xml file
size, //quantity
size //var arg
)
это вернет:
если размер = 1:1 элемент выбран
если размер = 2 (или больше): выбрано 2 (заданного размера) элемента