12 votes

Démarrage de l'activité à partir du projet Android-Library

Après une longue recherche, je n'ai pas trouvé de solution appropriée. J'ai un projet Android-Library avec presque tout le code de l'application. Depuis l'activité principale du projet de bibliothèque, je lance un Intent to en explicite Activity A. Dans mon projet dérivé, qui utilise le projet de bibliothèque, j'ai étendu cette Activity A et ajouté du nouveau code. Le problème est que la Superclasse de l'Activité A répondra et non la classe dérivée.

Dans le manifeste du nouveau projet qui utilise le projet de bibliothèque, j'ai déclaré la nouvelle activité avec le nouveau paquet.

Voici l'appel à l'intention du projet de bibliothèque :

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

Voici la classe dérivée AndroidActivity :

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

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
            ...

Je n'arrive pas à accéder à la méthode onCreate.

Le manifeste du projet de bibliothèque :

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

Et voici le manifeste du nouveau projet :

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

C'est ce que j'ai fait :

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

Je ne voulais pas faire autant de changements dans le projet de la bibliothèque, car un troisième projet devrait utiliser le code existant avec l'AndroidActivity non modifié.

Toutes les autres choses fonctionnent bien pour moi. Par exemple, les mises en page modifiées sont utilisées dans le nouveau projet.

Comment puis-je gérer ce problème ? Peut-être des changements dans le manifeste du nouveau projet dans lequel je déclare, que la nouvelle activité doit être appelée au lieu de la superclasse ?

Merci d'avance !

1voto

rupps Points 1859

Lorsque vous faites cela dans votre projet de bibliothèque

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

AndroidActivity fait référence à l'adresse du projet de bibliothèque AndroidActivity : Un projet ne connaît pas d'autres projets externes à moins que vous ne les incluiez en tant que bibliothèque. Vérifiez simplement vos importations, vous importez AndroidActivity et de demander à Android de l'exécuter.

D'ailleurs, c'est évident, ce serait un mauvais modèle de conception si le projet de bibliothèque devait connaître les projets dérivés.

Une solution facile est de remplacer l'activité de lancement sur le projet dérivé, quelque chose comme ceci :

Activité du projet de la bibliothèque :

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

L'activité de votre projet dérivé :

@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

    .
    .
}

Ainsi, lorsque vous appelez runMyActivity() à partir de n'importe où, la fonction surchargée sera exécutée (à condition que l'activité de démarrage étende l'activité du projet de bibliothèque et surcharge cette méthode). Et dans le contexte de la fonction surchargée, AndroidActivity.class sera votre activité dérivée (ou l'autre, vous pouvez importer n'importe laquelle car ici vous avez accès aux activités dérivées ET à celles du projet de bibliothèque).

0voto

Kumar Bibek Points 5768

Dans votre nouveau projet, vous pourriez utiliser un nom différent, au lieu de AndroidActivity. Si vous ne voulez pas faire cela, le deuxième nom pleinement qualifié d'AndroidActivity dans le fichier manifeste devrait résoudre votre problème. Vous vous trompez peut-être un peu dans les paquets, quelque part.

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

devrait être

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

Je voulais dire, l'AndroidActivity. D'une certaine manière, vous avez pris la mauvaise classe d'activité dans le mauvais paquet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X