【问题标题】:Android get list of string resources from special fileAndroid从特殊文件中获取字符串资源列表
【发布时间】:2014-12-24 19:39:44
【问题描述】:

例如,我有 my_string.xml 带有字符串的文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="my_string">My string</string>
    <string name="another_string">Another string</string>
    {...}
</resources>

是否可以通过编程方式将此字符串列表/哈希图?是的,我知道我可以接受by name 或类似this 的东西。但我需要以编程方式动态获取它,例如,HashMap&lt;String, String&gt;

或者所有的字符串资源在构建后会合并在一起,无法分开?

【问题讨论】:

  • 为什么需要这个?因为你有arrays.xml,你可以直接放置字符串数组。 A
  • @jaumard 哦,这很难说 =/
  • 好的^^你不能从一个文件中获取字符串,因为编译时合并在一起:/但是你可以像我告诉你的那样自己创建一个数组@string/string1_from_file 但你必须手动完成

标签: android android-resources


【解决方案1】:

将文件放在raw 文件夹中。然后你必须打开文件

InputStream in = getResources().openRawResource(R.raw.yourfile);

并手动解析内容,例如将列表保存为 xml 或 json 并解析它并构建您想要的 HashMap 或您喜欢的任何内容。请记住,这可能是一个阻塞操作,不应在主 UI 线程上运行,异步运行它,但这取决于您尝试解析的文件的长度,但通常您应该在异步线程中运行它

---- 更新 你可以这样做:

int stringRes[] = {R.string.my_string, R.string.another_string}
List<String> myStrings = new ArrayList<String>();
for (int id : stringRes){

   String str = getResources().getString(id);
   // TODO do some if check if you want to keep that string or whatever you want to ...
   myStrings.add(str);
}

您可以将它们存储到 HashMap 中(但 getResources().getString() 已经像 HashMap 一样)或 List

【讨论】:

  • 这样我不能通过getResources().getStrings()获取字符串,但我需要它。
  • 好的,那么您的问题是什么?你知道R.string.my_string 对吗?所以您可以使用getResources().getStrings(R.string.my_string) 访问字符串,对吗?我已经更新了我的答案,但我不确定你想做什么......
  • 我需要完整的字符串列表,有时我需要按键获取字符串)
  • 什么是“关键”...提供一个包含所有可能字符串(如int stringRes[] = {R.string.my_string, R.string.another_string})的列表并执行 for 循环检查是否要加载字符串有什么问题...如果您不提供有关问题描述的更多详细信息,我无法为您提供帮助
  • 设计师给了我这个文件,所以我用一些基本的字符串像 R.string.another_string 一样工作,但我也想把字符串当作 HashMap。并且为新字符串更改代码并不好。 Mb 我应该使用 StringArray =/
【解决方案2】:

如果您想访问 strings.xml 文件中的所有字符串,您可以在 R.string 类上使用反射。

Field[] fields = R.strings.class.getFields();
String[] allStringsNames = new String[fields.length];
for (int  i =0; i < fields.length; i++) {           
    allStringsNames[i] = fields[i].getName();
}

然后您可以将它们存储在Hashmap 或任何您想要的地方

【讨论】:

  • 我不需要所有字符串,我只想从一个文件中获取字符串,这就是问题 =/
【解决方案3】:

XML 文件的全部意义在于充当“哈希图”类型...您始终可以通过使用contextR.string 引用来获取字符串。我假设您知道这一点,那么您必须尝试创建对此的简化引用?

创建HashMap 需要静态引用(不适用于 XML)或列表的运行时创建。您可以在 Application 类中创建列表,但我会提醒您不要这样做。您可能无法引用 context,但同样,您可以使用 Application 构造函数来确保您有对上下文的引用。

除此之外,您还应该查看StringArray 资源。它不允许您使用另一个字符串引用一个字符串,因为它是一个数组。以下是文档:

http://developer.android.com/guide/topics/resources/string-resource.html#StringArray

如果使用HashMap 非常重要,那么您可能不应该使用XML,而应该只创建一个static 类。 XML 资源文件主要用于集中数据(以简化对静态字符串的修改),更重要的是,用于多语言目的。静态 HashMaps 不是正确的用例。

【讨论】:

  • 我无法创建静态类。因为设计师给了我这个字符串文件,他不应该使用代码。
  • 如果您有这些限制,那么您可以创建字符串数组,然后为每个索引分配一个字符串值来创建您的 HashMap... 也可以使用 SmilerParser 作为示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2021-04-26
  • 1970-01-01
  • 2018-03-23
  • 2019-12-02
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多