从Plurals获取字符串以在XML中使用?

时间:2013-07-03 22:13:00

标签: android android-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"

删除了该字符串以支持Plural,我现在不确定如何从XML中检索我的字符串。我确实用

进行了一次天真的尝试
android:title="@plurals/cats"

但这只是给了我@1234567890而不是Cats(或Cat)。

任何人都知道是否可以从XML中检索Plural中的字符串?

7 个答案:

答案 0 :(得分:54)

您必须按代码设置:

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

答案 1 :(得分:9)

您可以通过将字符串资源留在原来的位置并在多个资源中引用它们来获得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>

现在您可以在XML文件中使用android:title="@string/cats"并使用

getQuantityString(R.plurals.cats, numberOfCats)

在运行时。

答案 2 :(得分:5)

现在可以从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类中)

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

答案 3 :(得分:1)

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

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 cariable

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

科特林

的更新答案

strings.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  
)

这将返回:

如果大小= 1 :选择了1个项目

如果大小= 2(或更大):选择2(给定大小)的项目