2012-06-11 9 views
5

Tengo dos aplicaciones de Android que comparten el 90% de su código entre sí, y debido a razones políticas (creo que también razones técnicas) deben tener nombres de paquete separados (para que aparezcan bajo diferentes URL en Google Play)¿Puedo alias R de alguna manera en Android?

Uso git con dos ramas para cada aplicación, y sincronizo las dos ramas manualmente antes de cada lanzamiento. Cuando ejecuto un comando diff de las dos ramas, muchos de mis archivos son diferentes cuando en realidad lo único diferente es el nombre del paquete del archivo generado automáticamente R, entonces para la primera aplicación tengo 15 archivos con

import pkg.name.one.R; 

y por la otra aplicación

import pkg.name.two.R; 

quiero importar alguna manera R de la misma manera para ambas clases.

He intentado envolver R de este modo:

paquete thescene;

public class RWrapper { 

    public class R extends pkg.name.one.R {} 

} 

(lo que haría RWrapper el único archivo diferente entre estas dos ramas en lo que respecta a la fuente o R) pero por desgracia R es una clase final (y no estoy siquiera seguro de esto hubiera funcionado de todos modos)

Entonces, ¿hay alguna manera de alias de alguna manera la clase R de una manera que me permita tener el import pkg.name.one.R;/import pkg.name.two.R; reemplazado por una declaración de importación unificada?

También estoy abierto a otras sugerencias que resolverían los problemas de sincronización :) mis

+0

su mejor importar 'R en statement' importación y retire el paquete innecesarios usando' CTRL + SHIFT + O' –

+0

No es realmente una respuesta a su pregunta, pero ¿colocó el código duplicado en un proyecto de biblioteca al que hace referencia desde cada aplicación o son las dos aplicaciones completamente separadas y tienen el 90% del mismo código? Y debe conservar el archivo R tal como está, y no tratar de usar el mismo para ambos proyectos – banzai86

+3

Mover el código compartido a la biblioteca de Android. Luego inclúyalo en ambas aplicaciones. – pawelzieba

Respuesta

0

No podrías modificar RWrapper hacer R un campo estático en lugar de una clase? Su código entonces acceder a través de RRWrapper.RClass...

Ejemplo

public class RWrapper 
{ 
    public static pkg.name.one.R R; 
} 

y

public class RWrapper 
{ 
    public static pkg.name.two.R R; 
} 

es posible acceder a los campos de I con:

RWrapper.R.<blah> 
+0

No funcionó, no me da acceso a los valores ... – daniel

0

seggy lo tenía casi justo, pero necesitas exponer cada R.class individualmente. Si el submódulo tiene su propio espacio de nombres, puede volver a utilizar el nombre de clase R y no necesita modificar nada en su submódulo.

package the.submodule.package; 

public final class R { 
public static the.app.package.R.string string; 
public static the.app.package.R.drawable drawable; 
public static the.app.package.R.id id; 
//public static the.local.appPackage.R.anythingElse anythingElse; 
} 

Nota: No estoy condonando el intercambio a través de proyectos de I, pero a veces las limitaciones de tiempo, etc.

Cuestiones relacionadas