2012-11-06 92 views
1

在过去的一个小时里,我一直试图弄清楚这一点。
我想一般从strings.xml得到字符串,并在我的代码,所以我可以动态更改字符串的数量,而无需更改我的代码中的任何东西,将它们加载到数组列表中。

到目前为止,我只有如何从strings.xml中获取字符串值并进入arraylist [android]

for(Field x :R.string.class.getFields()) 
     if(x.getName().startsWith("ans")) 
      choices.add(/*what do I add here to get the string value from the field in to the arraylist */); 

我想不出我的生活如何得到字符串值了现场的对象。我得到的所有内容都是Id(或者至少我认为是Id)或我在strings.xml文件中分配的名称。

回答

4
Resources res = getResources(); 
    for(Field x :R.string.class.getFields()) 
     if(x.getName().startsWith("ans")){ 
       int id = x.get(null); 
       choices.add(res.getString(id)); 
      } 
+0

是的,只是不得不改变x.get(null)并将其作为一个整数和环绕一个尝试,赶上 但这是我渴望的正确解决方案。 –

+0

有人请这个。 –

+0

try {choices.add(res.getString((Integer)x.get(null))); } //这获取ID,然后抓住相关 \t \t \t \t \t \t \t \t赶上(抛出:IllegalArgumentException E){e.printStackTrace()的资源;} \t \t \t \t赶上(IllegalAccessException E){e.printStackTrace ();} \t} –

1

创建RES/XML文件夹中的XML文件的example.xml

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <record name="foo" /> 
</data> 

然后分析它如下图所示

XmlResourceParser xrp = context.getResources().getXml(R.xml.example); 
try { 
    int eventType = xrp.next(); 
    while (eventType != XmlPullParser.END_DOCUMENT) { 
    if (eventType == XmlPullParser.START_TAG && xrp.getName().equalsIgnoreCase("record")) { 

     String name = xrp.getAttributeValue(null, "name"); 

     //choices.add(name); 
    } 

    eventType = xrp.next(); 
    } 
} catch (XmlPullParserException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

这太费力了。我想用反射。 Faylons的回答是我的需求的正确解决方案。 –

0

你可以试试这个:

choices.add(getResources().getString(R.string.string1)); 

string1是strings.xml中的字符串常量

+0

不够通用。我想从一个循环中添加,而不是从一堆添加硬编码的add()语句中添加,这会导致维护问题。 –

相关问题