Möglichkeiten für Wiederverwendung von Activities in mehreren Anwendungen?

Hi,

könnt ihr mir verraten welche Möglichkeiten es gibt Activities in mehreren Anwendungen wiederzuverwenden, um die Activities besser handhaben zu können? Beispiel Login-Activity: Bei meinen zwei Apps habe ich exakt den gleichen Aufbau der Login-Activity mit dem gleichen Layout-Aufbau. Wenn ich irgendwas in der Activity oder im Layout ändere muss ich es immer in den beiden Anwendungen machen…

Deshalb bräuchte ich eure Tipps wie ich das besser machen kann…

Danke!

Stichwort: library project
http://developer.android.com/tools/projects/projects-eclipse.html

Kann man aus einem Library Project eine Activity aus den Apps starten, die die Library verwenden?

Der Befehl
startActivity(new Intent(LoginActivity.this, MainActivity.class));
geht in dem Library Project nicht, da die MainActivity nicht gefunden werden kann.

Welche Lösung gibt es für das Problem?

Danke.

Ist die MainActivity im AndroidManifest.xml registriert?

In dem Library Project nicht.
In den Apps die das Library Project nutzen sollen ist jeweils eine MainActivity registriert in den AndroidManifest.xml Dateien.

Hm, ich habe einmal von einem Manifest-Merge-Bug gehört. Möglicherweise hast du gerade das gleiche Problem :-/

Als Workaround bietet sich an statt einer Login-Activity ein Login-Fragment zu erstellen und dieses Fragment in einer eigenen Activity zu verwenden. Die Activity macht dann nichts anderes als das Fragment anzuzueigen wodurch du das Code-Sharing erreichst.

Ich bin mir nicht sicher ob du mich richtig verstanden hast… :wink:

Also in dem Library Project ist eine LoginActivity. Wenn ich bei dieser LoginActivity auf den Login-Button drücke, sollen die MainActivities aus den jeweiligen „Android Application Projects“ die das LibraryProject nutzen gestartet werden.
Die MainActivities sind nicht in dem LibraryProject enthalten, sondern in den jeweiligen „Android Application Projects“.

D.h. ich möchte aus dem LibraryProject eine MainActivity starten die nicht zu dem LibraryProject dazugehört, sondern zu den „Android Application Projects“.

Kann mir schwer vorstellen das sowas nicht funktionieren kann, weil ich sonst den nutzen von den LibraryProjects nicht verstanden habe…

Sollte schon möglich sein. Aber ich wie gesagt, dazu müssen die jeweiligen Manifest-Dateien zusammen gemerged werden da ansonsten die jeweiligen Activities nicht registriert sind. Vor ein paar Jahren gab’s da noch einen Bug der genau das verhindert hat. Keine Ahnung ob dieser Bug noch da ist.

Generell ist’s eher selten, dass man Activities auslagert. UI unterscheidet sich im Normalfall von App zu App schon erheblich.

Vermutlich ist das der Fall. Es ist ja nicht Sinn, dass ein Library Projekt die Apps bzw. Klassen aus den Apps kennt. So eine Library soll ja unabhängig von konkreten Anwendungen von mehreren Apps verwendet werden. Das heißt eine Library darf konkrete Klassen einer App nicht kennen!

Keine Ahnung ob es unter Android dazu best practices gibt. Aber prinzipiell ist es ja möglich den Umfang in der Library relativ abstrakt zu halten, um dann in der eingebundenen Library auf Deine MainActivity.class zu zugreifen müsstest Du ähnlich wie eine „Instanz“ die „MainActivity.class“ an die Methode/Klasse der Library übergeben.

Um mal zu verdeutlichen, wie so etwas aussehen kann:

	  ...
	  ...
	  startActivity(new Intent(LoginActivity.this, actClass));
}```

Danke für die Antwort.

Habe ich mir schon gedacht dass ich das Prinzip von LibraryProjects nicht richtig verstanden habe…

Wie soll aber jetzt von den beiden Apps aus der LoginActivity die “Instanz” der MainActivities übergeben?
Dazu müsste ich ja der LoginActivity die MainActivity.class als Parameter übergeben, wenn ich diese starte… Ich starte aber die LoginActivity aus der AndroidManifest.xml Datei der beiden Apps.

AndroidManifest.xml:


    <uses-permission android:name="android.permission.INTERNET" />

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="xx.xxxx.android.libraryproject.activity.LoginActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="stateHidden" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="xx.xxxx.android.app.activity.MainActivity"
            android:configChanges="orientation|screenSize"
            android:label="@string/app_name" >
        </activity>
    </application>

</manifest>```

Wie gesagt, kapsel das Login-Zeug in einem Fragment und schreib dir dann die jeweiligen Login-Klassen im Projekt.