Cargar recursos (diseño) desde otro apk dinámicamente

Me las arreglé para tirar de los diseños, y lo agrego a mi viewflipper, sin embargo, allí se carga como en blanco.

El código es,

Resources packageResources; Context packageContext; try { packageResources = pm.getResourcesForApplication(packageName); packageContext = this.createPackageContext(packageName, Context.CONTEXT_INCLUDE_CODE + Context.CONTEXT_IGNORE_SECURITY); } catch(NameNotFoundException excep) { // the package does not exist. move on to see if another exists. } Class layoutClass; try { // using reflection to get the layout class inside the R class of the package layoutClass = packageContext.getClassLoader().loadClass(packageName + ".R$layout"); } catch (ClassNotFoundException excep1) { // Less chances that class won't be there. } for( Field layoutID : layoutClass.getFields() ) { try { int id = layoutID.getInt(layoutClass); XmlResourceParser xmlResourceLayout = packageResources.getLayout(id); View v = new View(this, Xml.asAttributeSet(xmlResourceLayout)); this.viewFlipper.addView(v); } catch (Exception excep) { continue; } } 

No tengo errores, y depurado y revisado. Los ID de diseño son correctos. Sin embargo, en mi viewFlipper su justo en blanco. No hay advertencias ni errores que pueda encontrar.

Finalmente lo conseguí … ¡Es realmente simple !!!!

Aquí es lo que hice …

  1. En el apk de destino, sólo hay recursos y diseños sin código de aplicación o de actividad. Creé una clase,

     public final class ViewExtractor { private static final int NUMBER_OF_LAYOUTS = 5; public static View[] getAllViews(Context context) { View[] result = new View[ViewExtractor.NUMBER_OF_LAYOUTS]; result[0] = View.inflate(context, R.layout.layout_0, null); result[1] = View.inflate(context, R.layout.layout_1, null); result[2] = View.inflate(context, R.layout.layout_2, null); result[3] = View.inflate(context, R.layout.layout_3, null); result[4] = View.inflate(context, R.layout.layout_4, null); return result; } } 

Luego, en mi aplicación actual, modifiqué mi código anterior. La modificación tiene lugar una vez que se ha comprobado que existe el paquete.

  // If the package exists then get the resources within it. // Use the method in the class to get the views. Class<?> viewExtractor; try { viewExtractor = packageContext.getClassLoader().loadClass(packageName + ".ViewExtractor"); } catch (ClassNotFoundException excep) { continue; } View[] resultViews; try { Method m = viewExtractor.getDeclaredMethod("getAllViews", Context.class); resultViews= (View[])m.invoke(null, new Object[]{packageContext}); for( View v : resultViews) { this.viewFlipper.addView(v); } } catch (Exception excep) { excep.printStackTrace(); } 

No está inflando un diseño. Estás creando una View vacía y agregándola a tu ViewFlipper .

Actualmente estoy haciendo esto. Sólo funciona si se conoce el paquete Nombre de actividad o fragmento de la .apk que debe proporcionar la jerarquía de diseño (llamo a este contexto externo). Y usted necesita saber el nombre del diseño que desea inflar (por ejemplo, R.layout.mylayout -> "mylayout")

 Context c = createPackageContext(foreignPackageName, Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY); //create foreign context int resId = c.getResources.getIdentifier(mylayoutName,"layout",foreignPackageName); LayoutInflater myInflater = LayoutInflater.from(c); //Inflater for foreign context View myLayout = myInflater.inflate(resId,null,false); //do not attach to a root view 
  • Android define la forma XML como dibujable mediante programación
  • Internacionalización del problema string.xml
  • Android: uso de recursos de otro proyecto en mi área de trabajo
  • Acceso al recurso definido en el tema y attrs.xml android
  • R.string; Obtener cadena de nombre de clave dinámica
  • Android OnClickListener - identificar un botón
  • Cómo agregar recursos de cadena en Eclipse?
  • Android reproducir archivos de recursos desde el almacenamiento interno provoca que MediaPlayer.prepare dé IOException
  • Proguard rompe el archivo de audio en activos o en bruto
  • Android: conversión entre cadenas, SpannedStrings y Spannablestrings
  • ¿Cómo referenciar una cadena de otro paquete en una biblioteca usando XML en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.