如何在Jetpack Compose中访问Plural资源字符串

18

我有以下内容

    <string name="loading_listing">Loading listings %d</string>
    <plurals name="loading_listing">
        <item quantity="one">Found %d listing</item>
        <item quantity="other">Found %d listings</item>
    </plurals>

如果我使用如下的string,一切都很好

Text(text = stringResource(R.string.loading_listing, 1))

但如果我使用复数形式(plurals),

Text(text = stringResource(R.plurals.loading_listing, 1))

它会崩溃

    android.content.res.Resources$NotFoundException: String resource ID #0x7f0d0003
        at android.content.res.Resources.getText(Resources.java:444)
        at android.content.res.Resources.getString(Resources.java:537)
        at android.content.res.Resources.getString(Resources.java:561)
        at androidx.compose.ui.res.StringResources_androidKt.stringResource(StringResources.android.kt:48)

我认为我不能使用stringResource(...)。那么应该使用什么?

4个回答

25

Compose 1.2

Jetpack Compose 1.2中新增了pluralStringResource函数。

pluralStringResource(id = R.plurals.loading_listing, count = 1)

在这个版本中,这是一个实验性的API,所以你需要添加注释@ExperimentalComposeUiApi

1.2之前的答案:

与此同时,在Compose库中还不可用,您可以为此创建一个帮助函数...

@Composable
fun pluralResource(
    @PluralsRes resId: Int,
    quantity: Int,
    vararg formatArgs: Any? = emptyArray()
): String {
    return LocalContext.current.resources
        .getQuantityString(resId, quantity, *formatArgs)
}

只要formatArgs是可空的并且具有默认值,这种方法就不起作用。因此,第三个参数应该是:vararg formatArgs: Any,以适应所有情况。 - Thaerith

4

从Compose 1.2开始,您可以使用pluralStringResource函数。

pluralStringResource(R.plurals.plurals_array, 1)

1.1.x 版本中没有获取复数资源的函数。

你可以使用以下方式:

val resources = LocalContext.current.resources

Text(
    text = resources.getQuantityString(
        R.plurals.loading_listing, 0, 10
    )
)

截至 1.0.3 版本,仍然不可用。我希望谷歌能够解决这个问题。 - kc_dev

2
为了更准确地提出问题,您需要这样调用它。
pluralStringResource(id = R.plurals.loading_listing, count = 1, 1)

由于第三个参数是formatArgs,您希望输出找到1个列表


0
更完整的解决方案:
/**
 * Load a plurals resource.
 *
 * @param id the resource identifier
 * @param qty the associated quantity
 * @return the string data associated with the resource
 */
@Composable
@ReadOnlyComposable
fun pluralsResource(@PluralsRes id: Int, qty: Int): String {
    val resources = resources()
    return resources.getQuantityString(id, qty)
}

/**
 * Load a plurals resource with formatting.
 *
 * @param id the resource identifier
 * @param qty the associated quantity
 * @param formatArgs the format arguments
 * @return the string data associated with the resource
 */
@Composable
@ReadOnlyComposable
fun pluralsResource(@PluralsRes id: Int, qty: Int, vararg formatArgs: Any): String {
    val resources = resources()
    return resources.getQuantityString(id, qty, *formatArgs)
}

/**
 * A composable function that returns the [Resources]. It will be recomposed when [Configuration]
 * gets updated.
 */
@Composable
@ReadOnlyComposable
private fun resources(): Resources {
    LocalConfiguration.current
    return LocalContext.current.resources
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接