Android: ссылаясь на ressources в пользовательском xml

У меня есть многоязычное приложение для Android, где я поместил разные переводы в файле strings.xml в соответствующий каталог.

Теперь у меня также есть собственный XML-файл, где я хотел бы ссылаться на такие тексты:

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

Теперь, когда я читаю атрибут title в своем коде, я, очевидно, получаю неразрешенную строку «@ + string / localizedtext», как это. Возможно ли каким-либо образом автоматически разрешить эту ссылку на локализованный текст?

благодаря!

Почти год спустя:

  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 / значения / strings.xml
    (Стандартные строки, обычно en-US для удобства, но это зависит от разработчика)
  <resources> <string name="sample_string">This is a sample string.</string> </resources> 
  • RES / значение-пт / strings.xml
    (Локализованные французские строки)
  <resources> <string name="sample_string">Ceci est un exemple de chaîne</string> </resources> 
  • Рез / 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); 

с :

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

То, как вы пытались, невозможно.

Вы можете получить аналогичную функциональность с ресурсом <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]; 

Локализация в Android выполняется с идентификаторами ресурсов. Ознакомьтесь с этим руководством по Android.

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

См. Обсуждение ниже.

Отличный ответ кий, стыд, мне все еще не хватает очков пирожных, чтобы оценить его. Чтобы ответить на вопрос Ника, просто измените последний бит кода на:

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

Обратите внимание, что я использовал 0 для значения по умолчанию для ресурса, поскольку это гарантировано никогда не будет реальным значением ресурса. -1 тоже сделал бы.