Java 读取自定义字符串资源

Java 读取自定义字符串资源,java,android,xml,Java,Android,Xml,我使用2个不同的xml文件来存储我需要的数据。启动应用程序时,我想读取这两个资源并从中生成对象。 让我解释一下,我在做什么: 第一个资源存储的事件名称如下:/res/values/event\u names.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="event_a">AAAA</string> <string name="event

我使用2个不同的xml文件来存储我需要的数据。启动应用程序时,我想读取这两个资源并从中生成对象。 让我解释一下,我在做什么: 第一个资源存储的事件名称如下:
/res/values/event\u names.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="event_a">AAAA</string>
    <string name="event_b">BBBB</string>
    <string name="event_c">CCCC</string>
    <string name="event_d">DDDD</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="event_a">
        <item>02:00</item>
        <item>11:30</item>
        <item>17:00</item>
    </string-array>
    <string-array name="event_b">
        <item>03:00</item>
        <item>12:30</item>
        <item>18:00</item>
    </string-array>
    <string-array name="event_c">
        <item>04:00</item>
        <item>13:30</item>
        <item>19:00</item>
    </string-array>
    <string-array name="event_d">
        <item>04:30</item>
        <item>10:00</item>
        <item>15:00</item>
        <item>20:00</item>
    </string-array>

</resources>
请注意,事件名称和时间的名称是通用的。启动时,应用程序将首先读取事件名称,然后找出相应的时间戳


我能按我计划的方式做吗?我必须从名称资源中读取所有标识符,然后根据该标识符获取时间。

为什么不将所有事件名称添加为
中的第一个元素。这样,您的事件名称将与其各自的时间紧密耦合。

Quick idea:

您可能可以将所有信息以JSON格式保存在资产文件夹中的一个文件中,如注释中所建议的@amalBit。 这样,您就不必进行解析,因为Android附带了一个JSON库,并且您不需要解析任何自定义格式的txt

或者以一种更丑陋的方式(我不是在写这个呵呵),您可以在一个条目中直接将JSON放在strings.xml中。这样可以避免您手动读取资产。但我不会这么做,因为strings.xml还有另一个含义(那就是存储要翻译的字符串)

如果您愿意,我可以稍后向您发布第一个案例的一些代码。


    <!-- ================= -->
    <!-- Event Mappings    -->
    <!-- ================= -->
    <eat-comment />

    <array name="event_lists">
        <item>@array/event_a</item>
        <item>@array/event_b</item>
        <item>@array/event_c</item>
    </array>

    <!-- =========== -->
    <!-- Event Lists -->
    <!-- =========== -->
    <eat-comment />

    <string-array name="event_a">
        <item>Event A</item>
        <item>02:00</item>
        <item>11:30</item>
        <item>17:00</item>
    </string-array>
    <string-array name="event_b">
        <item>Event B</item>
        <item>03:00</item>
        <item>12:30</item>
        <item>18:00</item>
    </string-array>
    <string-array name="event_c">
        <item>Event C</item>
        <item>04:00</item>
        <item>13:30</item>
        <item>19:00</item>
    </string-array>
@数组/事件\u a @数组/事件 @数组/事件\u c 事件A 02:00 11:30 17:00 事件B 03:00 12:30 18:00 事件C 04:00 13:30 19:00
代码:

List events=new ArrayList();//将所有事件放入列表中
TypedArray eventMappings=getResources().obtainTypedArray(R.array.event_列表);
对于(int-mappingVar=0;mappingVar

希望对您有所帮助:-)

另外一个选项是,您可以在资产文件夹中添加自定义资源并访问资产。哦。。是 啊ofc。。好的,如何从该资源中读取所有字符串数组?好的,您不能一次读取所有数组数据。您需要使用其id读取数组资源,如getStringArray(R.array.event_a)。但是我发布的逻辑将删除对strings.xml的额外调用,因为您将首先使用id R.string.event_a,然后使用它访问数组,而实际上您可以在一次获取中完成它。:/。。。因为我不想依赖硬编码。。。
List<Event> events = new ArrayList<Event>(); // putting all events into a list
TypedArray eventMappings = getResources().obtainTypedArray(R.array.event_lists);
for (int mappingVar = 0; mappingVar < eventMappings.length(); mappingVar++) {
    int eventId = eventMappings.getResourceId(mappingVar, 0);
    String[] eventInfos = getResources().getStringArray(eventId);
    Event event = new Event(); // your event domain class or whatever info holding class
    for (int infosVar = 0; infosVar < eventInfos.length; infosVar++) {
        switch (j) {
        case 0:
            event.setName(eventInfos[infosVar]);
            break;
        default:
            event.addTime(eventInfos[infosVar]);
            break;
        }
        events.add(event);
    }
}
eventMappings.recycle();    // important