Folgendes ist meine Situation:
Ich habe ein Bibliotheksprojekt und ein darauf basierendes Projekt. Jetzt in der Bibliothek habe ich zwei Klassen A und B, wobei A B verwendet. In dem Projekt, das die Bibliothek verwendet, habe ich eine andere Klasse B, die die Klasse B aus der Bibliothek überschreiben sollte.
Aber jedes Mal, wenn Klasse A einen Anruf tätigt, endet sie in der Klasse B aus der Bibliothek. Wie kann ich Android sagen, dass Klasse B von meinem Projekt sollte anstelle von Klasse B aus der Bibliothek verwendet werden?
Das funktioniert nicht mit dem aktuellen Layout. Sie müssen das Strategie-Muster verwenden. Definieren Sie LibA in Ihrer Bibliothek mit einem Konstruktor, der im Konstruktor ein Objekt vom Typ LibB verwendet:
%Vor%Dann können Sie LibB in Ihrem Projekt überschreiben und LibA mit der Klasse erstellen, die LibB erweitert:
%Vor%Antwort auf Turbos Frage:
Sie möchten Projektaktivitäten aus Ihrer Bibliothek starten. Also dann verschiebe den Code, der Intent
erzeugt in deine Projekte , denn nur in deinem Projekt kennst du den Typ oder den Namen des Activity
, das gestartet werden soll.
Die Lösung, die Sie in Ihrem Kommentar erwähnt haben ( hier ) erstellt das Intent
im Bibliotheksprojekt, indem der Name des zu startenden Activity
erraten wird. Daran ist eigentlich nichts falsch, aber es ist keine elegante Lösung. Sie können Activities
nur nach diesem speziellen Benennungsschema starten. Und deshalb können Sie nicht beliebig Activities
starten, die in Ihren Projekten sichtbar sind wie Activities
aus anderen Bibliotheken, wo Sie den Namen der Klasse nicht ändern können.
Um die Intent
-Erstellung in Ihre Bibliotheken zu verschieben, können Sie z. B. das Strategie-, Muster- oder Fabrikmethodenmuster verwenden. Siehe Designmuster auf Wikipedia für noch mehr (kreative) Muster, die zu Ihrem Bibliotheksdesign passen.
Eine einfache Lösung wäre:
Erstellen Sie eine Zusammenfassung LibraryActivity
und erweitern Sie Ihre ProjectActivities daraus. Das LibraryActivity
definiert eine abstrakte Methode, die das Intent
zurückgibt. Die Implementierung dieser abstrakten Methode erfolgt in Ihrem ProjectActivities
.
Wie ich aus Ihrem Kommentar sehe, haben Sie Klasse A, die Klasse B verwendet
Aber Klasse B sollte sich je nachdem, welches Projekt Sie verwenden, unterscheiden.
Ich denke, Sie müssen eine Basisklasse z. B. BaseB erstellen, die eine Instanzvariable in Klasse A sein wird, und Sie könnten einen Setter und Getter dafür haben. Oder Sie können einen Parameter an den Konstruktor der Klasse A. übergeben Wenn Sie A instanziieren, sollten Sie auswählen, welches Sie verwenden möchten.
Schauen wir uns den Code an
%Vor%Tags und Links class android android-library project