60

我正在使用复数来简化我的代码。例如,我曾经有

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

使用复数而不是多个字符串,我现在有了

<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 的复数中检索字符串?

4

7 回答 7

60

您必须通过代码设置它:

...setText(yourContext.getResources().getQuantityString(R.plurals.cats, catsCountVar));
于 2013-07-03T22:22:33.193 回答
15

通过将字符串资源留在原处并在复数资源中引用它们,您可以获得复数的运行时优势和字符串资源的静态优势。

来自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)

在运行时。

于 2017-09-04T23:13:03.900 回答
13

现在可以使用数据绑定表达式在 XML 中完成:

android:text="@{@plurals/cats(catCount)}"

有关更多信息,请参阅文档中的此页面:https ://developer.android.com/topic/libraries/data-binding/expressions#resources

于 2019-11-29T12:21:30.450 回答
10

这现在可以从 xml 中实现。如果您有复数形式的参数,则必须记住将数量变量传递两次。就像下面的例子一样。

<plurals name="number_of_students_in_topic">
    <item quantity="zero">None are currently in this topic.</item>
    <item quantity="one">One student is currently in this topic.</item>
    <item quantity="other">%d students are currently in this topic.</item>
</plurals>

在带有数据绑定的 xml 中。

android:text="@{@plurals/number_of_students_in_topic(count, count)}"

这是因为,使用getResources().getQuantityString(int id, int quantity, Object... formatArgs)在代码中转换带参数的复数(在 *BindingImpl 类中)

第一个计数是选择正确的复数形式,第二个是用正确的值格式化字符串。

于 2020-03-18T06:56:43.363 回答
5

如果您的字符串包含带数字的字符串格式,那么您需要发送整数变量两次,例如

字符串.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

科特林文件

resources.getQuantityString(
    R.plurals.numberOfMinute, //plural from strings.xml file
    min, //quantity 
    min //var arg  
)
于 2018-10-19T03:29:41.017 回答
1

这是一种使用复数资源作为自定义视图属性的方法。

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>

我的视图.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);
    }
}
于 2018-07-21T16:17:15.387 回答
0

Kotlin的更新答案

字符串.xml

<plurals name="lbl_items_selected">
    <item quantity="one">%d item Selected</item>
    <item quantity="other">%d items Selected</item>
</plurals>

科特林文件

resources.getQuantityString(
    R.plurals.lbl_items_selected, //plural from strings.xml file
    size, //quantity 
    size //var arg  
)

这将返回:

如果 size = 1 : 选择 1 个项目

如果 size = 2(或更多):选择 2(给定尺寸)项目

于 2019-09-23T11:07:35.410 回答