Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android:在自定义xml中引用Resources_Android_Resources_Localization - Fatal编程技术网

android:在自定义xml中引用Resources

android:在自定义xml中引用Resources,android,resources,localization,Android,Resources,Localization,我有一个多语言的android应用程序,我把不同的翻译放在相应目录下的strings.xml中 现在我还有一个自定义xml文件,我想在其中引用如下文本: <?xml version="1.0" encoding="UTF-8"?> <rooms> <room title="@+string/localizedtext" /> </rooms> 现在,当我在代码中读取title属性时,我显然得到了未解析的字符串“@+string/loc

我有一个多语言的android应用程序,我把不同的翻译放在相应目录下的strings.xml中

现在我还有一个自定义xml文件,我想在其中引用如下文本:

<?xml version="1.0" encoding="UTF-8"?>
<rooms>
    <room title="@+string/localizedtext" />
</rooms>

现在,当我在代码中读取title属性时,我显然得到了未解析的字符串“@+string/localizedtext”。 是否有可能自动将此链接解析为本地化文本


谢谢

你尝试的方式是不可能的

您可能会获得与资源类似的功能:

<resources>
    <string-array name="room">
        <item>@string/localizedText</item>
        <item>@string/otherLocalizedText</item>
    </string-array>
</resources>

Android中的本地化是通过资源标识符完成的。看看这个Android教程

请参阅下面的讨论。

差不多一年后:

    public static String getStringResource(Context context, String thingie) {
        try {
            String[] split = thingie.split("/");
            String pack = split[0].replace("@", "");
            String name = split[1];
            int id = context.getResources().getIdentifier(name, pack, context.getPackageName());
            return context.getResources().getString(id);
        } catch (Exception e) {
            return thingie;
        }
    }

那就行了。

这似乎是一个宽泛的答案,但我相信它会为那些花了数小时寻找它的人澄清很多事情(我就是其中之一)

简单的回答是肯定的,您可以在自定义XML中使用引用,不仅仅是字符串,为了便于理解,我使用了这个示例

考虑到背景:

  • res/values/strings.xml
    (默认字符串,通常为方便起见,由开发人员决定)

这是一个示例字符串。
  • res/values fr/strings.xml
    (本地化法语字符串)

这是一个很好的例子
  • res/xml/test.xml
    (自定义XML文件)

  • src/com/example/app/TestXmlParser.java
//为了清晰起见,省略了导入。
公共类testXmlParser{
公共静态最终字符串ns=null;
public int parse(XmlResourceParser解析器)抛出XmlPullParserException,
IOException{
while(parser.next()!=XmlPullParser.END_文档){
if(parser.getEventType()==XmlPullParser.START_标记){
if(parser.getName().equalsIgnoreCase(“示例”)){
//这才是最重要的,我们有一个
//资源标识符并返回它。
返回parser.getAttributeResourceValue(ns,“text”,-1);
}
}
}
返回-1;
}

使用
String getText(int-id)
获取与
id
对应的字符串(本地化,如果可用)

使用上述示例,相当于替换:

//Return the resource id
return parser.getAttributeResourceValue(ns, "text", -1);
与:

//Return the localized string corresponding to the id.
int id = parser.getAttributeResourceValue(ns, "text", -1);
return getString(id); 

回答得很好,kyis,可惜我仍然没有足够的分数来评分。要回答Nick的问题,只需将最后一段代码更改为:

int id = parser.getAttributeResourceValue(ns, "text", 0);
return (id != 0) ? getString(id) : parser.getAttributeValue(ns, "text");

请注意,我使用0作为资源的默认值,因为这保证永远不会是真正的资源值。-1也会这样做。

是的,我知道这已经是我所做的,但它与我的问题无关。创建对空字符串资源的新引用没有任何意义。我想我不清楚您的意思是什么s完成。在我看来,你只需要访问字符串资源的值。这是错误的吗?好吧,我所有的文本都在strings.xml中,适用于所有语言。如果直接使用它们,本地化是有效的。我的问题是,我如何在其他xml文件(我自己的自定义xml文件)中引用它们?编辑你的帖子请解锁它(只需在某处添加空白)。我无法删除下一票。这是什么类型的自定义XML?可能是一种布局?只需删除加号并按名称调用字符串引用。此外,所有本地化字符串引用是否都有唯一的名称?特定内容的每个翻译都应具有相同的引用名称。例如,要使用多种语言表达问候语u可以在值en和值es中都有一个名为“hello”的字符串,它们的值是“hello”和Hola"分别。这让开发人员在Android已经有办法本地化字符串的情况下处理代码本地化。
@string/localizedText
由操作系统进行本地化。家长已经告诉你这不是他想要的。谢谢你的-1。当你删除你的字符串时,我会删除我的-1。我理解你的解决方案是建议两个字符串,localizedText和其他localizedText,以两种不同的本地化方式包含相同的内容。不是这样吗?不,当您使用
@string/which
时,操作系统将在正确的
/res/values xx/filename.xml
文件中查找
一些本地化文本
,其中
xx
是您设备的本地化。可能是你可以分享更多关于你想要完成的事情吗?正如我在下面提到的,@+结构是用来创建一个新的引用的,对于@string来说这没有意义。我不相信你打算在这里创建一个新的字符串,而是创建一个对不同字符串资源的新引用。了解你的代码exa的用例会有帮助我正面临着这个问题……有什么答案吗?如果开发人员没有使用本地化字符串呢?其他属性会自动处理这两种情况,但此方法将失败。如果只有默认值可用,则getString将返回该值。(抱歉回答太晚)这应该是这个问题的答案。剪切并粘贴这个可爱的函数,鲍勃就是你的叔叔。谢谢
int id = parser.getAttributeResourceValue(ns, "text", 0);
return (id != 0) ? getString(id) : parser.getAttributeValue(ns, "text");