【问题标题】:get list of the strings present in strings.xml file in Android获取Android中strings.xml文件中存在的字符串列表
【发布时间】:2012-12-09 15:58:32
【问题描述】:

我想要 strings.xml 文件中存在的字符串列表。

有人知道怎么弄吗???我发现的一件事是它在 R.java 中按顺序分配 id,但如何获取起始 id 尚不清楚。

例如,我的 strings.xml 中有 100 个字符串,如下所示,我想一次读取,而不是为个人提供 getResources().getString(int id)。

<string name="app_label">Calendar</string>
<string name="what_label">What</string>
<string name="where_label">Where</string>
<string name="when_label">When</string>
<string name="timezone_label">Time zone</string>
<string name="attendees_label">Guests</string>
<string name="today">Today</string>
<string name="tomorrow">Tomorrow</string>

【问题讨论】:

  • 你可以使用getResources.getString("your_string_name");
  • 我知道,但是如果我使用这种方法,我想要所有字符串的列表,我必须给出所有字符串的 id,如果有 100 个字符串,我必须写 100 次
  • 在这里查看我的答案stackoverflow.com/questions/13820645/…
  • @Luksprog 谢谢伙计!!!!它工作正常..可以将此链接添加为答案,以便我可以接受它,每个人也可以参考相同的:)

标签: android


【解决方案1】:

你可以像这样在 res\values\strings.xml 文件中声明你的字符串。

 <string-array name="vehiclescategory_array">

        <item>Cars</item>
        <item>Bikes</item>
        <item>RVs</item>
        <item>Trucks</item>
        <item>Other Vehicles</item>

 </string-array>

在你的活动类中,你可以像下面这样访问它们。

String[] categories;

categories=getResources().getStringArray(R.array.vehiclescategory_array);

在上面的列表中,无论您声明什么序列,都与它在活动中分配给数组的方式相同。假设 Cars 将被分配到类别 [0]。希望这会有所帮助。

【讨论】:

  • 这看起来不错 :) 但我的问题是我已经将字符串定义为 xml 文件中的单个元素,我必须读取所有这些字符串
  • 为您的参考应用添加了更多解释:)
  • 您需要字符串中的 id 吗?如果是这样,您是否尝试过使用 getIdentifier()?但我可能不得不说,如果您不使用数组,如果我理解正确,您需要在活动代码中提及每个字符串名称以获取相应字符串的 id。
  • 是的,你是对的,我必须通过每个 R.id 来获取名称,但如果我能得到字符串的第一个 Id,我可以增加它,直到我得到 null。例如,如果第一个字符串是 R.id.hello 而不是 String s = getResources.getString(R.id.hello+i);直到我得到空值,但问题是如何找到哪个字符串得到了第一个 id
  • R.id.hello+i 行不通。你必须找到其他选择。
【解决方案2】:

您可以声明一个整数数组,其中每个字符串都有一个条目。我曾经为一组颜色做过这个,所以我想它也适用于字符串。

res/values/arrays.xml

<integer-array name="app_strings">
    <item>@string/app_label</item>
    <item>@string/what_label</item>
    <item>@string/where_label</item>
    <item>@string/when_label</item>
    <item>@string/timezone_label</item>
    <item>@string/attendees_label</item>
    <item>@string/today</item>
    <item>@string/tomorrow</item>
</integer-array>

然后在您的代码中,您将遍历数组并将每个值用作 getString() 的参数。

int[] stringIds = getResources().getIntArray(R.array.app_strings);
String[] strings = new String[stringIds.length];
for (int i = 0; i < stringIds.length; i++) {
    strings[i] = getString(stringIds[i]);
}

问题是每当你修改你的字符串资源时,你必须手动更新你的arrays.xml,所以它肯定不理想。

【讨论】:

  • 迄今为止最简洁的答案
【解决方案3】:

如果您想访问 strings.xml 文件中的所有字符串,您可以在 R.string 类上使用反射。可以在this answer 中找到一个示例,您只需要将可绘制对象替换为字符串即可。

【讨论】:

  • 它返回键值对值做什么?
【解决方案4】:
Field[] fields = R.string.class.getDeclaredFields(); // or Field[] fields = R.string.class.getFields();
String str = "";
for (int  i =0; i < fields.length; i++) {
    int resId = getResources().getIdentifier(fields[i].getName(), "string", getPackageName());
    str += fields[i].getName() + " = ";
    if (resId != 0) {
        str += getResources().getString(resId);
    }
    str += "\n";
}

您将在“str”变量中获得所有字符串代码及其值。

【讨论】:

    【解决方案5】:
    String[] categories = getResources().getStringArray(R.array.stars_array);
            List<String> stringList = new ArrayList<>(Arrays.asList(categories));
    

    使用这个简单的

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 2016-12-02
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2011-10-31
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多