O_Casper_ne 2013-09-26 09:28 采纳率: 7.7%
浏览 1086

位于文件夹res\xml\里的xml文件中的@strings不能运行

我使用下面的代码来获取一个 nameList。
我希望 nameList 的内容是 Inbox, Sent, Outbox 和 Draft。
但实际上 nameList 的内容是 @string/Inbox, @string/Sent, @string/Outbox 和@string/Draft。为什么啊?

private void InitVar(){
    ArrayList nameList=new ArrayList<String>();
    ArrayList valueList=new ArrayList<String>();
    ParXML(this, nameList, valueList);                              
}

public static void ParXML(Context context, List<String> nameList,List<String> valueList) {
    XmlResourceParser xrp = context.getResources().getXml(R.xml.msgfolder);
    try {
        while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {
            if (xrp.getEventType() == XmlResourceParser.START_TAG) {
                String tagName = xrp.getName();
                if (tagName.equals("item")) {
                    nameList.add(xrp.getAttributeValue(null, "name"));
                    valueList.add(xrp.getAttributeValue(null, "value"));
                }
            }
            xrp.next();
        }
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Values\strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="Inbox">Inbox</string>
    <string name="Sent">Sent</string>
    <string name="Outbox">Outbox</string>
    <string name="Draft">Draft</string>   
</resources>

xml\msgfolder.xml

<?xml version="1.0" encoding="utf-8"?>
<MsgHandle>
   <item name="@string/Inbox" value="content://sms/inbox"></item>
   <item name="@string/Sent" value="content://sms/sent"></item>
   <item name="@string/Outbox" value="content://sms/outbox"></item>
   <item name="@string/Draft" value="content://sms/draft"></item>
</MsgHandle>
  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-20 20:11
    关注

    该回答引用ChatGPT

    在你的 msgfolder.xml 文件中,你将 name 属性的值设置为了 "@string/Inbox", "@string/Sent", "@string/Outbox" 和 "@string/Draft",这意味着它们是字符串资源的引用。 当你使用 xrp.getAttributeValue(null, "name") 获取属性值时,你得到的是引用的字符串资源的名称,而不是字符串本身的内容。


    因此,当你将它们添加到 nameList 中时,它们实际上是字符串资源的名称,而不是字符串本身。要获取字符串本身的内容,你需要使用 context.getString() 方法。更改 ParXML() 方法中添加到 nameList 的行,使用 context.getString() 方法来获取字符串的内容,如下所示:

    nameList.add(context.getString(context.getResources().getIdentifier(xrp.getAttributeValue(null, "name"), "string", context.getPackageName())));
    

    这会将引用字符串资源的名称转换为对应的字符串。 请注意,如果资源名称不正确或不存在,则 context.getResources().getIdentifier() 方法将返回 0。在这种情况下,getString() 方法将返回一个空字符串。


    所以你的 ParXML() 方法的完整代码应该是这样的:

    public static void ParXML(Context context, List<String> nameList, List<String> valueList) {
        XmlResourceParser xrp = context.getResources().getXml(R.xml.msgfolder);
        try {
            while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {
                if (xrp.getEventType() == XmlResourceParser.START_TAG) {
                    String tagName = xrp.getName();
                    if (tagName.equals("item")) {
                        String name = xrp.getAttributeValue(null, "name");
                        String value = xrp.getAttributeValue(null, "value");
                        nameList.add(context.getString(context.getResources().getIdentifier(name, "string", context.getPackageName())));
                        valueList.add(value);
                    }
                }
                xrp.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?