2011-08-07 16 views
10

después de una búsqueda larga No he podido encontrar ninguna solución adecuada. Tengo un proyecto de biblioteca Android con casi todo el código para la aplicación. A partir de la actividad principal en el proyecto de la biblioteca, comienzo un Intento de actividad explícita A. En mi Proyecto derivado, que usa el Proyecto de la biblioteca, amplié esta Actividad A y agregué un código nuevo. El problema es que la Superclase de la Actividad A responderá y no la clase derivada.Actividad de inicio de Android-Library-Project

En el manifiesto del nuevo proyecto que utiliza el proyecto de biblioteca, he declarado la nueva actividad con el nuevo paquete.

Aquí es el llamado Intención del Proyecto para bibliotecas:

Intent i = new Intent(getApplicationContext(), AndroidActivity.class); 
startActivity(i); 

Aquí es la clase AndroidActivity derivados:

public class AndroidActivity extends de.app.library.activities.AndroidActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
      ... 

no soy capaz de llegar al Método onCreate

El Manifest from the Library Project:

<?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" /> 

por lo que tengo:

de.app.library.activities.AndroidActivity and 
de.app.free.activities.AndroidActivity 

Yo no quería hacer mucho cambios en el proyecto de la biblioteca beacuase una tercer proyecto debe usar el código existente con la intacta AndroidActivity

Todo lo demás 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 de antemano!

Respuesta

0

En su nuevo proyecto, podría usar un nombre diferente, en lugar de AndroidActivity. Si no desea hacer eso, el segundo nombre completo de AndroidActivity en el archivo de manifiesto debería resolver su problema. Quizás estés jugando un poco con los paquetes, en alguna parte.

 
activity android:name="de.app.library.activities.AndroidActivity" 

debería ser

 
activity android:name="de.app.free.activities.AndroidActivity" 

que quería decir, la AndroidActivity. De alguna manera, estás recogiendo la clase de actividad incorrecta del paquete equivocado.

+2

En el nuevo proyecto, no tengo una clase de actividad principal. Estoy señalando el proyecto de la biblioteca. Solo AndroidActivity tiene algunos cambios y es por eso que lo he extendido. – treimy

1

Al hacer esto en su proyecto de biblioteca

Intent i = new Intent(getApplicationContext(), AndroidActivity.class); 

AndroidActivity se refiere a la AndroidActivity el proyecto de biblioteca: Un proyecto no sabe acerca de otros proyectos externos salvo que los incluya como una biblioteca. Simplemente compruebe sus importaciones, está importando AndroidActivity y ordenando a Android que lo ejecute.

que por cierto es obvio, sería un patrón de diseño malo si el proyecto de la biblioteca tenía que saber acerca de los proyectos derivados

Una solución fácil es para anular la actividad de lanzamiento del proyecto derivado, algo como esto :

Libary proyecto 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 
    . 
    . 
} 

la actividad de su 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 llame a runMyActivity() desde cualquier lugar, ejecutará la función sobrescrita (siempre que la actividad de inicio amplíe la actividad del proyecto de la biblioteca y anule ese método). Y en el contexto de la función modificada, AndroidActivity.class será su actividad derivada (o la otra, puede importar cualquiera de ellas porque aquí tiene acceso a las actividades derivadas Y a los proyectos de la biblioteca).

Cuestiones relacionadas