如何访问JetpackCompose字符串中的复数资源



我有以下

<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(...)。那是什么?

组合1.2

Jetpack Compose 1.2中有一个pluralStringResource函数。

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

在这个版本中,它是一个实验性的API,因此您需要添加注释@ExperimentalComposeUiApi

1.2版前的回答

同时,它在Compose lib中不可用,您可以为此创建一个助手函数。。。

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

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

为了更准确地回答问题你需要这样称呼它

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

因为第三个参数是formatArgs,并且您想要输出Found 1 listing

更完整的解决方案:

/**
* 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
}

最新更新