web-dev-qa-db-fra.com

Obtenir une chaîne de pluriels à utiliser en XML?

J'utilise Plurals pour simplifier mon code. par exemple, j'avais l'habitude d'avoir 

<string name="cat">Cat</string>
<string name="cats">Cats</string>

En utilisant Plurals au lieu de plusieurs chaînes, j'ai maintenant

<plurals name="cats">
    <item quantity="one">Cat</item>
    <item quantity="other">Cats</item>
</plurals>

Cependant, j’avais l'habitude de récupérer des chaînes à utiliser comme titres ou résumés dans mon fichier XML

Android:title="@string/cats"

Ayant supprimé cette chaîne au profit d'un pluriel, je ne sais plus trop comment récupérer ma chaîne à partir de XML. J'ai fait une tentative naïve avec

Android:title="@plurals/cats"

mais cela me donne simplement @1234567890 au lieu de Cats (ou Cat).

Quelqu'un sait s'il est possible de récupérer une chaîne d'un pluriel à partir de XML?

48
Duke

Vous devez le définir par code:

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

Vous pouvez bénéficier des avantages d'exécution des pluriels et des avantages statiques des ressources de chaîne en laissant vos ressources de chaîne où elles se trouvent et en les référant dans vos ressources plurielles.

From https://developer.Android.com/guide/topics/resources/string-resource.html#Plurals (caractères gras ajoutés).

<item>

Une chaîne plurielle ou singulière. La valeur peut être une référence à une autre ressource de chaîne. Doit être un enfant d'un élément. Attention, vous devez échapper aux apostrophes et aux guillemets. Voir Formatage et style, ci-dessous, pour plus d'informations sur le style et le formatage appropriés de vos chaînes. Exemple:

<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>

Maintenant, vous pouvez utiliser Android:title="@string/cats" dans des fichiers XML et également utiliser

getQuantityString(R.plurals.cats, numberOfCats)

à l'exécution.

8
Clement Cherlin

Si votre chaîne inclut un formatage avec un nombre, vous devez envoyer la variable entière deux fois, exemple

strings.xml

<resources>
    <plurals name="numberOfMinute">
        <item quantity="one">%d minute</item>
        <item quantity="other">%d minutes</item>
    </plurals>
</resources>

en 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 cariable
1
L-X

Voici une façon d'utiliser une ressource plurielle en tant qu'attribut de votre vue personnalisée.

src/main/res/xml/layout.xml

<com.mypackage.MyView
    app:foo="@plurals/cats"/>

src/main/res/values ​​/ 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);
    }
}
0
cambunctious