Actividad inicial de Android-Library-Project
Después de una larga búsqueda no pude encontrar ninguna solución adecuada. Tengo un proyecto de Android-Biblioteca con casi todo el código para la aplicación. De la actividad principal en el proyecto de la biblioteca comienzo un intento a explícito Actividad A. En mi proyecto derivado, que utiliza el proyecto de la biblioteca, he extendido esta actividad A y agregado un nuevo código. El problema es que la Superclase de Actividad A responderá y no la clase derivada.
En el manifiesto del nuevo Proyecto que utiliza el proyecto de biblioteca he declarado la nueva Actividad con el nuevo paquete.
- Herramientas SDK actualizadas y ADT a 17 y ahora obtener VerifyErrors
- ActivityNotFoundException (YES, esta actividad se declara en AndroidManifest.xml)
- Cómo hacer referencia a un icono de un proyecto de biblioteca en AndroidManifest.xml de la aplicación
- Error 'aapt'. Pre Compiler Build abortado
- No se pudo encontrar Library.apk!
Esta es la llamada de intención del proyecto de la biblioteca:
Intent i = new Intent(getApplicationContext(), AndroidActivity.class); startActivity(i);
Aquí está la clase derivada de AndroidActivity:
public class AndroidActivity extends de.app.library.activities.AndroidActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ...
No puedo llegar al método onCreate
El Manifiesto del Proyecto de la Biblioteca:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.app.library" android:versionName="1.0" android:versionCode="1"> <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".activities.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activities.AndroidActivity" android:label="@string/act_android" /> </application>
Y aquí el Manifiesto del nuevo Proyecto:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.app.free" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="de.app.library.activities.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activities.LernenActivity" android:label="@string/act_lernen" />
Así que tengo:
de.app.library.activities.AndroidActivity and de.app.free.activities.AndroidActivity
No quería hacer que muchos cambios en el proyecto de biblioteca beacuase un tercer proyecto debe utilizar el código existente con la intacta AndroidActivity
TODAS otras cosas funciona bien para mí. Por ejemplo, los diseños cambiados se utilizan desde el nuevo proyecto.
¿Cómo puedo manejar ese problema? Tal vez cambios en el Manifiesto del nuevo proyecto en el que declaro, que la nueva actividad debería ser llamada en lugar de la superclase?
¡Gracias por adelantado!
- ¿Cómo agregar un proyecto de biblioteca a un proyecto androide?
- Gradle: añadir dependencia para un sabor específico de la biblioteca
- ¿Para comprobar o no verificar "IsLibrary"?
- Biblioteca de Android AAR dependiendo de otra biblioteca
- Cómo importar módulo sin crear copia en Android Studio
- Cómo incluir archivos jar en el proyecto de la biblioteca android
- En Eclipse, ¿cómo puedo acceder rápidamente al origen de un "proyecto de biblioteca de Android" desde el origen de un proyecto que lo usa?
- Biblioteca ya agregada: Gradle Build
Cuando lo hace en su proyecto de biblioteca
Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
AndroidActivity
refiere a AndroidActivity
del proyecto de biblioteca: Un proyecto no conoce otros proyectos externos a menos que los incluya como una biblioteca. Sólo comprueba tus importaciones, importas AndroidActivity
e instruye a Android para que funcione.
Que por cierto es obvio, sería un mal patrón de diseño si el proyecto de la biblioteca tuviera que saber sobre los proyectos derivados
Una solución fácil es anular el lanzamiento de la actividad en el proyecto derivado, algo así:
Proyecto Libary Actividad:
public void runMyActivity() { Intent i = new Intent(getApplicationContext(), AndroidActivity.class); // You are on the library project, so you can refer to the activities created in it. // the only AndroidActivity known here is the library project's . . }
Actividad de tu proyecto derivado:
@Override public void runMyActivity() { // You are now on the derived project, so you can refer to // the activities created in it, and also to the library project's. You // just import the package name of the desired activity or use fully qualified // names Intent i1 = new Intent(getApplicationContext(), AndroidActivity.class); // this one will use the activity in the imports Intent i2 = new Intent(getApplicationContext(), de.app.libarary.AndroidActivity.class); // use the activity from the library project Intent i3 = new Intent(getApplicationContext(), de.app.free.AndroidActivity.class); // use the activity from the derived project . . }
Por lo tanto, cuando llama a runMyActivity () desde cualquier lugar, ejecutará la función overriden (siempre que la actividad de inicio amplíe la actividad del proyecto de biblioteca y reemplace ese método). Y en el contexto de la función overriden, AndroidActivity.class será su actividad derivada (o la otra, puede importar cualquiera de ellas porque aquí tiene acceso a las actividades derivadas y al proyecto de la biblioteca).
En su nuevo proyecto, podría utilizar un nombre diferente, en lugar de AndroidActivity. Si no desea hacerlo, el segundo nombre completo de AndroidActivity en el archivo de manifiesto debe solucionar su problema. Usted es quizá estropeando para arriba con paquetes un poco, en alguna parte.
Actividad android: name = "de.app.library.activities.AndroidActivity"
debiera ser
Actividad android: name = "de.app.free.activities.AndroidActivity"
Quiero decir, la AndroidActivity. De alguna manera, estás recogiendo la clase de actividad equivocada del paquete equivocado.
- ¿Cómo puedo desactivar el valor alfa de Android Lollipop ripple?
- Comprender claramente el cálculo de la matriz