sourcesets - Especificar dependencias de proyectos de Android(en Eclipse)
debug release android studio (5)
Tengo dos proyectos de Android, un ''proyecto de biblioteca'' que contiene un diseño personalizado y un ''proyecto de aplicación'' que contiene una aplicación que usa el diseño.
Todo parece construir y ejecutar bien, excepto que el editor de diseño visual arroja una ClassNotFoundException (que supongo que es un error en el complemento), pero cuando intento comenzar a hacer uso de los atributos que definí para el diseño personalizado en el xml, ya no puedo construir. Es decir; esto funciona:
<?xml version="1.0" encoding="utf-8"?>
<se.fnord.android.layout.PredicateLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="asdfasdf"
/>
</se.fnord.android.layout.PredicateLayout>
Mientras que esto no:
<?xml version="1.0" encoding="utf-8"?>
<se.fnord.android.layout.PredicateLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fnord="http://schemas.android.com/apk/res/se.fnord.android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
fnord:layout_horizontalSpacing="1px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="asdfasdf"
/>
</se.fnord.android.layout.PredicateLayout>
La construcción falla con un mensaje de aapt:
ERROR No se ha encontrado ningún identificador de recurso para el atributo ''layout_horizontalSpacing'' en el paquete ''se.fnord.android''
El identificador de recursos existe en el archivo R y attrs.xml contenía el proyecto de la biblioteca, y si pongo el código de diseño y los recursos directamente en el proyecto de la aplicación todo funciona bien. El atributo layout_horizontalSpacing (y layout_verticalSpacing) es un atributo personalizado utilizado en la clase PredicateLayout.LayoutParam para especificar la distancia al siguiente widget.
Hasta ahora he intentado las formas estándar de eclipse especificando referencias de proyecto y compilando dependencias de proyecto de ruta. También me dijeron que probara la etiqueta en el manifiesto de la aplicación, lo que no ayudó.
Entonces, ¿qué debo hacer para que las referencias en el archivo xml funcionen?
No sé si es relevante, pero el manifiesto de ''biblioteca'' se ve así:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="se.fnord.android"
android:versionCode="1" android:versionName="1.0.0">
</manifest>
La ''aplicación'' se manifiesta así:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="se.fnord.appname"
android:versionCode="1" android:versionName="1.0.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".AppName"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
(El ''PredicateLayout'', por cierto, es una versión limpiada de esto ).
Exporte su proyecto de biblioteca como un JAR y hágalo referencia en el "Java Build Path" de su aplicación como JAR.
La solución "Exportar tu biblioteca como contenedor" solo funciona si el proyecto de tu biblioteca solo contiene código fuente. En este caso, la pregunta del OP menciona que su proyecto de biblioteca contiene material relacionado con la interfaz de usuario.
Tenemos exactamente el mismo problema en mi equipo de querer tener proyectos de biblioteca que contengan fuentes y recursos relacionados con la interfaz de usuario. Terminamos revisando nuestro sistema de compilación Ant para que las aplicaciones abarquen los proyectos de la biblioteca durante el tiempo de compilación. Lamentablemente, ninguna solución de este tipo parece ser compatible con Eclipse y esta es una fuente importante de frustración para los desarrolladores. Todavía podemos usar Eclipse, pero tenemos que pasar por los aros para que funcione y tenga que soportar una productividad disminuida.
Exportar el proyecto como un JAR no es la forma correcta de vincular un proyecto de biblioteca a su proyecto de aplicación a través de Propiedades -> Ruta de compilación de Java -> Biblioteca. Tampoco es para vincular el proyecto como un proyecto requerido a través de Propiedades -> Ruta de compilación de Java -> Proyectos.
Antes que nada, lea el tema de proyectos de la biblioteca en los desarrolladores de Android -> Desarrollo -> Gestión de proyectos: http://developer.android.com/guide/developing/projects/index.html#LibraryProjects Después de esto, lea Configuración de una biblioteca Proyecto y referencia de temas de proyectos de una biblioteca de nuevo en Android Developers -> Developing -> Managing projects -> From Eclipse With ADT
Entonces ... los pasos son:
- Cree su proyecto de biblioteca normalmente como un proyecto de Android;
- Establezca "is library" en las propiedades del proyecto -> Android Cree su proyecto de aplicación normalmente;
- Agregue una referencia a su biblioteca en las propiedades del proyecto -> Android -> Agregar.
Después de esto, puede usar todas las clases, componentes (actividades, servicios, proveedores, receptores), recursos, etc.
Ej .: para hacer referencia a cualquier recurso en un diseño xml, por ejemplo, debe usar @mylib: id / my_id o @mylib: layout / my_lib_layout
Obs .: si usa componentes de su biblioteca en un proyecto de aplicación, debe replicarlos en el manifiesto de su aplicación.
Además, tengo los atributos funcionando, pero no de la forma en que debería funcionar, creo.
Debe usar como espacio de nombres en el elemento que usa sus atributos personalizados, el espacio de nombres de su aplicación principal, no el del proyecto de la biblioteca. Entonces, en su ejemplo, si especifica el valor de "xmlns: fnord" en el espacio de nombres de su proyecto de aplicación, funciona.
Además, al leer los atributos personalizados en su constructor personalizado PredicateLayout(Context,AttributeSet)
, también debe especificar el espacio de nombres de la aplicación en las llamadas a attributes.getAttributeValue()
.
Lo cual es un problema, ya que ese código está en su aplicación de la biblioteca que no / no debería saber sobre el proyecto de la aplicación en la que se usa. Lo solucioné haciendo que la aplicación llamara a un método estático ViewUtil.setAttributeNamespace (appNamespace) en la aplicación onCreate () de mi aplicación y las vistas personalizadas de la biblioteca usan ese espacio de nombres para recuperar los atributos personalizados. El archivo attrs.xml también puede permanecer en el proyecto de la biblioteca. Ahora, lo único feo es que el diseño XML debe usar el espacio de nombres de la aplicación en vistas personalizadas, por lo que no puede poner esos XML de diseño en el proyecto de la biblioteca.
Las primeras versiones de SDK de Android no admitían compartir en el nivel del código fuente de una manera agradable. Podrías sacudir tus archivos .class y luego agregarlos a la carpeta lib /, pero esta solución no permitía compartir directamente el código fuente y, lo que es más importante, no permitía el uso compartido de recursos o archivos aidl.
Luego, en mayo de 2010, Android presentó el mecanismo del Proyecto de Biblioteca. Un Library Project está estructurado de forma muy similar a un proyecto normal de Android, pero en lugar de ser utilizado para producir un apk, solo sirve para proporcionar código y recursos a otros proyectos. Al igual que un proyecto ordinario, un proyecto de biblioteca generalmente contiene carpetas src y res, junto con un archivo AndroidManifest.xml; sin embargo, el manifiesto debe estar en su mayoría vacío, con la excepción del elemento manifiesto y el atributo del paquete (ya no es verdadero; ahora puede declarar Actividades y otros componentes en el manifiesto de su Proyecto de biblioteca). Además, el archivo project.properties para un proyecto de biblioteca debe contener la propiedad:
"android.library=true"
Para hacer una referencia de un proyecto ordinario (productor de apk) a un Proyecto de biblioteca, debe agregar una línea "android.library.reference.N" en el archivo project.properties del proyecto ordinario. Por ejemplo, si mi proyecto principal desea apuntar a dos proyectos de biblioteca, mi archivo project.properties para el proyecto principal incluiría lo siguiente:
android.library.reference.1=../LibraryA
android.library.reference.2=../../LibraryB
donde el ../ y el ../../ son los caminos respectivos desde el proyecto principal hasta los Proyectos de la Biblioteca (esto es solo un ejemplo). Tenga en cuenta que esta lista de referencias está basada en 1 y no debe contener vacíos o duplicados. Google sabe muy bien que este no es un sistema perfecto, pero era una solución razonable que era compatible con Ant y Eclipse. En general, su IDE intentará mantener estos archivos por usted, pero a veces puede necesitar editarlos a mano.
Al principio, Library Projects no admitía lo siguiente:
- Proyectos de biblioteca que apuntan a otros proyectos de biblioteca
- Proyectos de biblioteca que contienen archivos aidl
- Biblioteca Proyectos que contienen la carpeta de activos
Sin embargo, las versiones siguientes de SDK resolvieron todos estos problemas.
Para obtener más información sobre proyectos de biblioteca, consulte la documentación oficial .