Android: referencia a recursos en xml personalizado

Tengo una aplicación Android multilingüe, donde he puesto las diferentes traducciones en strings.xml en el directorio respectivo.

Ahora también tengo un archivo xml personalizado, donde me gustaría referenciar textos como este:

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

Ahora, cuando leo el atributo de título en mi código, obviamente obtener la cadena no resuelta "@ + string / localizedtext" como es. ¿Es posible de alguna manera resolver este enlace al texto localizado automáticamente?

¡Gracias!

Casi un año después:

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

Eso lo hará.

Esto podría parecer una respuesta amplia, pero creo que va a aclarar un montón de cosas para las personas que pasaron horas buscando (soy uno de ellos).

La respuesta corta es sí, puede utilizar referencias en XML personalizado, no sólo para cadenas, pero ese es el ejemplo que uso, para facilitar la comprensión.

Considerando el contexto:

  • Res / values ​​/ strings.xml
    (Por defecto las cadenas, por lo general en-US por conveniencia, pero eso es hasta el desarrollador)
  <resources> <string name="sample_string">This is a sample string.</string> </resources> 
  • Res / values-fr / strings.xml
    (Cuerdas francesas localizadas)
  <resources> <string name="sample_string">Ceci est un exemple de chaîne</string> </resources> 
  • Res / xml / test.xml
    (Archivo XML personalizado)
  <!-- @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 / example / app / 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; } 

Use String getText(int id) para obtener la cadena correspondiente a id (localizada, si está disponible).

Utilizando el ejemplo anterior equivaldría a reemplazar:

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

con :

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

La manera en que lo intentaste no es posible.

Puede obtener funcionalidad similar con <string-array> recurso:

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

Entonces lo usarías así:

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

La localización en Android se hace con identificadores de recursos. Echa un vistazo a este tutorial de Android.

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

Ver discusión abajo.

Gran respuesta kyis, la vergüenza todavía no tengo suficientes puntos de brownie para calificarlo. Para responder a la pregunta de Nick, solo cambia el último bit de código a:

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

Tenga en cuenta que usé 0 para el valor predeterminado del recurso, ya que esto garantiza que nunca será un valor de recurso real. -1 habría hecho también.

  • Recursos útiles del sistema Android
  • Mapa de bits en Android: Tamaño de los recursos para mostrar como 50dp
  • Android usando recursos de matriz xml
  • Android obtiene una lista de colores de los recursos
  • ¿Por qué es imposible acceder a los recursos de manera estática?
  • Crujido / embalaje de recursos con aapt en hormigas construir utiliza caché de otros proyectos
  • ¿Cómo puedo usar layout_width usando el archivo de recursos?
  • Android que soporta todas las tabletas - categorice dibujos y diseños
  • Android ImageButton - determina qué recurso está configurado actualmente
  • Android - colors.xml recurso a valor int
  • No se encontró ningún recurso que coincida con el nombre dado: attr 'android: actionModeShareDrawable'
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.