2012-04-12 8 views
5

Me gustaría obtener la forma correcta de analizar las etiquetas personalizadas de Android con un XmlResourceParser. Estoy usando Eclipse 3.6 con el complemento de Android, y me gustaría que algunos atributos como el name se expandan con la cadena completa desde strings.xml.El analizador XML personalizado de Android no resuelve el espacio de nombres de Android

Aquí está el index.xml que se está analizando en la carpeta res/xml/.

<?xml version="1.0" encoding="utf-8"?> 
<Index xmlns:android="http://schemas.android.com/apk/res/android"> 
<Sheet 
    shortName="o_2sq" 
    android:name="@string/o_2sq" 
    instructions="" 
/> 
</Index> 

Aquí está el archivo strings.xml en la carpeta res/values/

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="o_2sq">Organize two squares</string> 
</resources> 

y el fragmento de código que analiza la primera index.xml con un XmlResourceParser:

String name = xpp.getAttributeValue(null, "android:name"); 
String shortName = xpp.getAttributeValue(null, "shortName"); 

La variable name contiene null, pero shortName contiene "o_2sq". También probé el siguiente sin éxito:

String name = xpp.getAttributeValue("android", "name"); 

Cuál es la forma correcta de escribir la frase de manera que el nombre de la variable contendría "Organize two squares"?

Respuesta

1

mejor solución que encontró para superar ese problema.

String s = xpp.getAttributeValue("http://schemas.android.com/apk/res/android", "name"); 
String name = null; 
if(s != null && s.length() > 1 && s.charAt(0) == '@') { 
    int id = Integer.parseInt(s.substring(1)); 
    name = getString(id); 
} else { 
    name = ""; 
} 
+1

¿Querías decir 'else {name = s '}'? Parece que eso permitiría que ese atributo sea un recurso o una cadena codificada, ¿no? –

+0

Necesitaba el nombre para no ser nulo en mi caso. Esta es la razón por. –

4

Prueba esto:

String name = xpp.getAttributeValue("http://schemas.android.com/apk/res/android", "name"); 
+1

Buen intento. Da algo mejor: mi variable 'name' ahora contiene la cadena' "@ 2131099651" '. No estoy seguro por qué. –

+0

Probablemente sea una ID de recurso de cadena. Intenta usar getString (número); método para obtener la cadena. – skywall

1
final String NAMESPACE_ANDROID = "http://schemas.android.com/apk/res/android"; 
final int VALUE_NOT_SET = -1; 
int resId = parser.getAttributeResourceValue(NAMESPACE_ANDROID, "name", VALUE_NOT_SET); 
String value = null; 
if (VALUE_NOT_SET != resId) { 
    value = context.getString(resId); 
} 

creo que el código anterior podría ayudarle.

Cuestiones relacionadas