如何使用带格式参数的getQuantityText,以便可以在字符串中使用数量?

时间:2017-12-30 23:20:22

标签: android string-formatting android-resources

使用简单字符串,您可以使用Resources.getQuantityString(int, int, ...)来传递占位符值。因此复数资源可以在字符串中使用%d,您可以插入实际数量。

我希望在复数形式内使用字体标记<b>等。所以我在看Resources.getQuantityText(int, int)。遗憾的是,您无法传递占位符值。我们在源代码中看到,在带有占位符的getQuantityString中,它们使用String.format。

是否有使用复数字体格式的解决方法?

2 个答案:

答案 0 :(得分:3)

首先,让我们看看“正常”情况(不起作用的情况)。你有一些复数资源,如:

textView.setText(getResources().getQuantityString(R.plurals.myplural, 2, 2));

你在Java中使用它是这样的:

<b>

正如您所发现的,这只会让您看到没有粗体的“2项”。

解决方案是将资源中的<plurals name="myplural"> <item quantity="one">only 1 &lt;b>item&lt;/b></item> <item quantity="other">%1$d &lt;b>items&lt;/b></item> </plurals> 标记转换为使用html实体。例如:

String withMarkup = getResources().getQuantityString(R.plurals.myplural, 2, 2);
text.setText(Html.fromHtml(withMarkup));

现在,您需要在Java代码中添加另一个步骤来处理这些html实体。 (如果你没有更改java,你会看到“2&lt; b&gt; items&lt; / b&gt;”。)这是更新后的代码:

class Mutation{
        public static void main(String [] args){
            int i=0;
            String SPECIAL_CHARS = "?!$@";
            String password = "Something";
            for (int pos = 0; pos < password.length(); pos++) {
                char c = password.charAt(pos);
                if(SPECIAL_CHARS.indexOf(c) < 0) {
                 i++;
                }
            }
    }
}

现在您将成功看到“2 项目”。

答案 1 :(得分:0)

您可以将字符串包装在<div style="background-color: grey; padding: 13px;"><h1>This part of the site is the menu, this part should be unnafected</h1></div> <div class="flex"> <div> <h1>This part should be closer to the left side</h1> </div> <div> <h1>This part should be closer to the right side</h1> </div> </div> <![CDATA[中,而不是转义HTML标签:

]]>

此外,在Kotlin中,您可以创建扩展功能,以便可以使用<plurals name="myplural"> <item quantity="one"><![CDATA[only 1 <b>item</b>]]></item> <item quantity="other"><![CDATA[%1$d <b>items</b>]]></item> </plurals> 检索样式化的复数:

resources.getQuantityText(R.plurals.myplural, 2, 2)