在 Jetpack Compose 中使用对象时,如何从 xml 文件中获取字符串?

How to get a String from an xml file when using an object in Jetpack Compose?

提问人:Mister Propre 提问时间:10/1/2023 更新时间:10/1/2023 访问量:55

问:

与其直接写“红色”、“黄色”和“绿色”,我想从 xml 中获取字符串。

object Apples {
    val apples = listOf("red", "yellow", "green"
    )
}

我试过了,但它不起作用。val context = LocalContext.current

xml 字符串 kotlin 对象 android-jetpack-compose

评论


答:

1赞 Hezy Ziv 10/1/2023 #1

在 res/values/strings 中定义字符串.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="apple_red">red</string>
    <string name="apple_yellow">yellow</string>
    <string name="apple_green">green</string>
</resources>

然后。

import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import com.example.yourapp.R

object Apples {
    @Composable
    fun getAppleColors(): List<String> {
        return listOf(
            stringResource(R.string.apple_red),
            stringResource(R.string.apple_yellow),
            stringResource(R.string.apple_green)
        )
    }
}

@Composable
fun AppleList() {
    val apples = Apples.getAppleColors()
    // Use 'apples' list in your Composable, it now contains the strings from XML.
}

评论

0赞 Mister Propre 10/1/2023
多谢。然后我会用这种方式来解决我的问题。
2赞 Primož Ivančič 10/1/2023 #2

无法访问 中的上下文。 我建议你不要直接写颜色,而是使用这样的东西:object

object Apples {
    val apples = listOf<Int>(
        R.string.red,
        R.string.yellow,
        R.string.green,
    )
}

这样,当您需要输出任何值时,只需调用 .stringResource(apples[0])

话虽如此,我可能会(取决于用例)通过使用以下方法解决这个问题:enum

enum class Apples(val nameResId: Int) {
    Red(R.string.red),
    Yellow(R.string.yellow),
    Green(R.string.green)
}

字符串的实际表示不应烘焙到对象本身中,而应由 UI 处理。虽然您可以在 中创建一个函数,但您将创建另一个可组合函数,但您将无法在可组合函数外部使用。@Composableobject

评论

0赞 Mister Propre 10/1/2023
感谢您的信息。我想你的建议也会帮助我解决我的问题