web-dev-qa-db-fra.com

Utilisation d'un projet de bibliothèque Android Activité dans un autre projet

J'ai un projet de bibliothèque Android que j'aimerais utiliser depuis un autre projet Android.

La bibliothèque a une activité déclarée dans son AndroidManifest. Quand j'essaye ce qui suit dans le deuxième projet:

        Intent intent = new Intent(this, ReaderActivity.class);
        startActivity(intent);

Je reçois l'exception suivante:

 Java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.digitalpages.reader.demo/br.com.digitalpages.reader.demo.ReaderDemoActivity}: Android.content.ActivityNotFoundException: Unable to find explicit activity class {br.com.digitalpages.reader.demo/br.com.digitalpages.reader.ReaderActivity}; have you declared this activity in your AndroidManifest.xml?
     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2663)
...
 Caused by: Android.content.ActivityNotFoundException: Unable to find explicit activity class {br.com.digitalpages.reader.demo/br.com.digitalpages.reader.ReaderActivity}; have you declared this activity in your AndroidManifest.xml?
     at Android.app.Instrumentation.checkStartActivityResult(Instrumentation.Java:1404)
     at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1378)
...

Comment puis-je ouvrir l'activité d'un autre projet?

EDIT: Par les réponses des utilisateurs j’ai ajouté la ligne suivante dans mon deuxième projet

<uses-library Android:name="br.com.digitalpages.reader" Android:required="true" />

Mais ça ne fonctionne toujours pas

36

Je crois que vous devez inclure l’activité <activity> dans votre propre journal AndroidManifest.xml. Je ne pense pas qu’il soit pris dans une bibliothèque. Je n'ai pas ma référence pour ça.

Mise à jour: C'est une solution officielle. De le doc :

Déclaration des composants de la bibliothèque dans le fichier manifeste

Dans le fichier manifeste du projet d'application, vous devez ajouter Déclarations de tous les composants que l'application utilisera qui sont importé d'un projet de bibliothèque. Par exemple, vous devez déclarer tout <activity>, <service>, <receiver>, <provider>, etc., ainsi que <permission>, <uses-library> et des éléments similaires.

Les déclarations doivent référencer les composants de la bibliothèque par leur noms de package pleinement qualifiés, le cas échéant.

35
mah
Intent intent = new Intent(Android.content.Intent.ACTION_VIEW);
intent.setComponent(new ComponentName("packagename//ex-com.hello", 
                                     "classname//ex-com.hello.ExampleActivity"));
startActivity(intent);

Et assurez-vous que dans la bibliothèque vous avez déclaré les activités. Vous n'avez pas besoin de déclarer les activités de la bibliothèque dans le manifeste de votre projet actuel.

19
sheetal

Cela marche:

Dans votre bibliothèque, mettez votre Activity personnalisé:

public class MyLibraryActivity extends ListActivity { ... }

Pas besoin de le mettre dans un manifeste . Dans votre projet Android appelant, créez un wrapper vide (factice):

public class MyActivity extends MyLibraryActivity { } 

et ajoutez une référence à cette classe à votre manifeste:

<activity Android:name="my_package.MyActivity" ... />
4
barnabas
3
Aleadam

vous devez importer uniquement le code de l'activité (pas le manifeste aussi), puis déclarer votre activité (de la bibliothèque) dans le manifeste de votre deuxième projet 

1
Houcine

Je suis conscient que la question est assez ancienne, mais je pense que cela pourrait aider des personnes comme moi qui ont le même problème.

Avec Eclipse, le meilleur moyen de partager du code et des activités entre bibliothèques est probablement celui qui se trouve dans la documentation Android ici:

Gestion de projets depuis Eclipse avec ADT

1
qwlice

Il n'est pas nécessaire d'ajouter explicitement une activité dans le manifeste de votre projet principal si vous l'avez déjà ajoutée dans le manifeste de votre bibliothèque à l'aide du code suivant lors du démarrage de l'activité de la bibliothèque.

Pour Kotlin

   val myIntent = Intent(activityContext, ActivityToLaunch::class.Java)
    // Needed to set component to remove explicit activity entry in application's manifest
    myIntent.component = ComponentName(activityContext, PickerActivity::class.Java)
    activityContext.startActivity(myIntent, PICKER_REQUEST_CODE)

Pour Java

    Intent myIntent = new Intent(activityContext, PickerActivity.class);
    // Needed to set component to remove explicit activity entry in application's manifest
    final ComponentName component = new ComponentName(activityContext, PickerActivity.class);
    myIntent.setComponent(component);
    activityContext.startActivity(myIntent, REQUEST_CODE);
0
minhazur