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:
- Android: Acceso a string.xml utilizando el nombre de la variable
- Gradle Robolectric Resources NotFoundException en pruebas
- Recursos android de escala automática
- El tamaño de la instalación de la aplicación es el mismo en diferentes tipos de dispositivos
- ¿Hay alguna manera de utilizar los recursos android no públicos en mi aplicación?
<?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!
- No se encontró ningún recurso que coincida con el nombre dado
- Uso del recurso @string dentro de una definición de estilo
- Calabash Android: Error de ruta de acceso al intentar ejecutar una prueba en un APK
- Android: ¿Cómo agregar R.raw al proyecto?
- ¿Agregar nuevas líneas a un recurso de texto en Android?
- Lista completa de todas las carpetas de recursos de Android?
- Gestión de activos entre la versión de escritorio y de dispositivo en libgdx
- Bitmaps de Android en la memoria de fugas xml?
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.
- Método retrieveRequestToken aumenta "La comunicación con el proveedor de servicios falló: null"
- Cómo mostrar MessageBox en Monodroid