如何在我的数据源 class 中访问我的字符串数组资源中的项目?

How can I access the items in my string-array resource within my Datasource class?

我正在尝试创建一个使用字符串作为键并将 StringArrays 作为值的映射。我正在我的数据源 class.

中创建这张地图

我想用作键的字符串在 strings.xml 中声明如下:

<string-array name="races">
        <item>Archfiend</item>
        <item>Asrai</item>
        <item>Blinkbeast</item>
        <item>Crogoblin</item>
        <item>Demonaga</item>
        <item>Dragonborn</item>
        <item>Dwarf</item>
        <item>Elf</item>
        <item>Fairy</item>
        <item>Gnome</item>
        <item>Grey</item>
        <item>Half-Dragon</item>
        <item>Half-Elf</item>
        <item>Half-Orc</item>
        <item>Half-Troll</item>
        <item>Halfling</item>
        <item>Haud</item>
        <item>Human</item>
        <item>Kodama</item>
        <item>Loralai</item>
        <item>Nekojin</item>
        <item>Parasite</item>
        <item>Satyr</item>
        <item>Slime</item>
        <item>Tiefling</item>
    </string-array>

例如,我想将字符串“Archfiend”映射到字符串数组“archfiend_subraces”。

<string-array name="archfiend_subraces">
        <item>Aerial</item>
        <item>None</item>
    </string-array>

我的数据源 class 如下所示:

package com.example.anime5echaractersheet.data

import android.content.res.Resources
import com.example.anime5echaractersheet.R

class Datasource {

    private val raceList: Array<String> = Resources.getStringArray(R.array.races)

    val subraceMap: Map<String, Int> = mapOf(
        raceList[0] to R.array.archfiend_subraces
    )
}

我无法使用 getStringArray(),我不确定为什么

我也尝试使用 getResources() 而不是 Resources,但我似乎也无法使用它。预先感谢您的帮助。

您必须从上下文实例中检索资源实例。您不能只使用 class 的名称来调用它的函数。因此,您的 DataSource class 在其构造函数中需要一个 ContextResources 参数。但是,我建议不要使用字符串资源作为键,因为如果您的应用程序有字符串的翻译并且用户更改了他们的语言设置,它会破坏您的应用程序。

我建议在 json 文件中定义所有类型和子类型列表,使用唯一键而不是文字值。这样您就不必将所有这些硬编码的手动资源“连接”到彼此。例如,如果您想添加或删除某个种族,这将使从单个 Json 文件编辑您的内容变得更加容易。例如:

{
  "races" : [
    "archfiend" {
      "subraces" : [ "ariel", "none" ]
    },
    "asrai",
    ...
  ]
}

然后不使用 string-array 资源,而是使用使用 json 中的键作为其名称的普通 string 资源。

<string name="archfiend">Archfiend</string>
<string name="ariel">Ariel</string>
<string name="none">None</string>
<string name="asrai">Asrai</string>

在运行时,您可以使用此辅助函数来检索实际的字符串:

fun Context.resourceKeyToString(key: String): String =
    resources.getString(resources.getIdentifier(key, "string", packageName))

你的问题离题了。您可以在 Android.

中查找有关使用 Json 的教程