Подтвердить что ты не робот

Получение строки из Plurals для использования в XML?

Я использую 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?

4b9b3361

Ответ 1

Вы должны установить его по коду:

...setText(yourContext.getResources().getQuantityString(R.plurals.cats, catsCountVar));

Ответ 2

Вы можете пользоваться преимуществами 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)

во время выполнения.

Ответ 3

Если ваша строка включает в себя форматирование строки с номером, то вам нужно дважды отправить целочисленную переменную, например

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  
)

Ответ 4

Вот способ использования множественного ресурса в качестве атрибута вашего пользовательского представления.

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);
    }
}

Ответ 5

обновленный ответ для 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 (заданного размера) элемента