android:引用自定义xml中的资源

时间:2010-11-24 14:17:10

标签: android resources localization

我有一个多语言的Android应用程序,我已将不同的翻译放在strings.xml中的相应目录中。

现在我还有一个自定义的xml文件,我想引用这样的文本:

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

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

谢谢!

5 个答案:

答案 0 :(得分:6)

差不多一年后:

    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;
        }
    }

那就行了。

答案 1 :(得分:5)

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

简短的回答是肯定的,您可以使用自定义XML中的引用,而不仅仅是字符串,但这是我使用的示例,以便于理解。

考虑上下文:

  • RES /值/ strings.xml中
    (默认字符串,为方便起见,通常是en-US,但这取决于开发人员)
    <resources>
        <string name="sample_string">This is a sample string.</string>
    </resources>
  • RES /值-FR / strings.xml中
    (本地化法语字符串)
    <resources>
        <string name="sample_string">Ceci est un exemple de chaîne</string>
    </resources>
  • RES / XML /的test.xml
    (自定义XML文件)
    <!-- @string/sample_string identifies both
         the default and french localized strings,
         the system settings determine which is used at runtime.
    -->
    <test>
        <sample name="sampleName" text="@string/sample_string"/>
    </test>
  • 的src / COM /示例/应用程序/ TestXmlParser.java
    //Omitted imports for clarity.

    public class testXmlParser {
        public static final String ns = null;

        public int parse(XmlResourceParser parser) throws XmlPullParserException,
                                                          IOException{
            while(parser.next() != XmlPullParser.END_DOCUMENT){
                if(parser.getEventType() == XmlPullParser.START_TAG){
                    if(parser.getName().equalsIgnoreCase("sample")){

                        // This is what matters, we're getting a
                        // resource identifier and returning it.
                        return parser.getAttributeResourceValue(ns, "text", -1);    
                    }
                }
            }
            return -1;
        }

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

使用上面的例子,它将取代:

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

with:

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

答案 2 :(得分:4)

你尝试的方式是不可能的。

您可能会使用<string-array>资源获得类似的功能:

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

然后你会像这样使用它:

String[] room = getResources().getStringArray(R.array.room);
String localizedText = room[0];
String otherLocalizedText = room[1];

答案 3 :(得分:1)

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

http://developer.android.com/resources/tutorials/localization/index.html

见下面的讨论。

答案 4 :(得分:0)

很棒的回答kyis,惭愧我仍然没有足够的布朗尼点来评价它。要回答Nick的问题,只需将最后一段代码更改为:

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

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