¿Cómo crear un LayoutInflater dado XmlPullParser como entrada?

Tengo una entrada de cadena que contiene un Layout.xml con String Fromat.

 // String that contains the Layout.xml :

 String concat ;

 // Create the XmlPullParser from the String format

 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

 factory.setNamespaceAware(true);

 XmlPullParser xpp = factory.newPullParser();
 xpp.setInput( new StringReader (concat) ); 

 // create le The LayoutInflater 

 LayoutInflater inflater =         (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

 View myView = inflater.inflate(xpp, null);

Tengo este error:

03-12 08: 23: 12.876: W / System.err (937): android.view.InflateException: START_TAG http://schemas.android.com/apk/res/android}android:orientation='vertical '{http://schemas.android.com/apk/res/android} android: layout_width = 'fill_parent' {http://schemas.android.com/apk/res/android} android: layout_height = 'fill_parent'> @ 1: 226 en java.io.StringReader@44f50508: Error al inflar la clase

Ayuda por favor ?

preguntado el 12 de marzo de 12 a las 08:03

1 Respuestas

Parece que el Inflater solo acepta XmlBlock.

He escrito un método para hacer esto, puede consultar el sitio del proyecto: https://github.com/liudongmiao/preference-fragment-compat/blob/master/src/me/piebridge/android/preference/PreferenceFragment.java#L202

Los códigos principales como este:

// byte[] data = ... 
// bytes of compiled xml (unzip the apk, get the bytes from res/layout*/*.xml)

// XmlBlock block = new XmlBlock(data);
Class<?> clazz = Class.forName("android.content.res.XmlBlock");
Constructor<?> constructor = clazz.getDeclaredConstructor(byte[].class);
constructor.setAccessible(true);
Object block = constructor.newInstance(data);

// XmlPullParser parser = block.newParser();
Method method = clazz.getDeclaredMethod("newParser");
method.setAccessible(true);
XmlPullParser parser = method.invoke(block);

Respondido 09 Feb 14, 10:02

Estoy tratando de usar tu PreferenceFragment.getParser(String xml) método en su repositorio. Veo que pasas public static final String LAYOUT en su getParser() método e inflar LAYOUT como herramienta de edición del View. ¿Cómo generaste String LAYOUT? Supongo que codificó el código compilado de su diseño de alguna manera, pero quiero conocer los detalles para poder codificar mi propio diseño en el mismo formato que lo hizo para LAYOUT...? - Wess

@Wess lo he escrito en los comentarios. Lea de nuevo. - liudongmiao

Gracias @liudongmiao. He seguido tus pasos pero siempre consigo NullPointerException: Attempt to invoke interface method 'java.lang.String org.xmlpull.v1.XmlPullParser.getPositionDescription()' on a null object reference. Mis pasos: descomprimir apk -> copiar el diseño compilado a res / raw en el proyecto -> leer el contenido del archivo de diseño en String en tiempo de ejecución -> convertir String en byte[] data y pasar a Object block = constructor.newInstance(data);. ¿No estás seguro de lo que estoy haciendo mal? Se agradecerá cualquier ayuda. - Wess

Implemento su código pero en tiempo de ejecución, obtengo InvocationTargetException. en el registro una línea superior a la excepción, veo una línea sobre XmlBlock: Bad XML block: header size 28024 or total size 1702240364 is larger than data size 2757 - samiazar

@liudongmiao: sería bueno que respondiera las preguntas de los usuarios en los comentarios anteriores. Encontré su enfoque interesante, pero no lo he probado. ¿Este enfoque sigue siendo válido y funciona? ¿Un código binario de archivos XML precompilados contiene algunos ID preasignados para cada vista? Si es así, eso podría causar conflictos con las ID existentes, si dicho diseño se infla en otra vista. ¿Podría actualizar sus respuestas con más información sobre los datos binarios, el uso y la limitación de su enfoque? ¡Gracias! - Ωmega

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.