Enum oder Objekt durch eine Absicht weitergeben (die beste Lösung)
Ich habe eine activity, die beim Start benötigt Zugriff auf zwei verschiedene ArrayLists. Beide Listen sind verschiedene Objekte habe ich selbst angelegt habe.
Grundsätzlich muss es eine Möglichkeit geben diese Objekte, um die Aktivität von einem Vorsatz. Ich kann verwenden addExtras (), aber dies erfordert eine Parceable kompatibel Klasse. Ich könnte meine Klassen übergeben werden, serialisierbar, aber so wie ich das verstehe dies verlangsamt das Programm.
Was sind meine Optionen?
Kann ich passiere ein Enum?
Als eine Nebenbemerkung: gibt es eine Möglichkeit zur übergabe von Parametern an eine Tätigkeit Konstruktor aus, Absicht?
InformationsquelleAutor der Frage jax | 2010-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine alte Frage, aber jeder nicht zu erwähnen, dass Enums sind eigentlich
Serializable
und kann daher perfekt werden Hinzugefügt, um eine Absicht als eine extra. Wie diese:Den Vorschlag für die Verwendung statischer oder Anwendung breit Variablen ist eine wirklich schlechte Idee. Das ist wirklich Paare, die Ihre Aktivitäten in einen Zustand verwalten von system-und es ist schwer zu warten, zu Debuggen und das problem gebunden.
ALTERNATIVEN:
Einen guten Punkt wurde bereits von tedzyc über die Tatsache, dass die Lösung von Oderik Sie gibt einen Fehler. Aber die alternative ist ein bisschen bröckeln-einige verwenden auch Generika).
Wenn Sie wirklich besorgt über die Leistung der addition der enum-eine Absicht, die ich Vorschlage, diese alternativen statt:
OPTION 1:
Verwendung:
OPTION 2:
(generische, wiederverwendbare und entkoppelt von der enum)
Verwendung:
InformationsquelleAutor der Antwort pablisco
Können Sie machen Sie Ihre enum-Parcelable implementieren, das ist ziemlich einfach für enums:
Können Sie dann mit Absicht.putExtra(String Parcelable).
UPDATE: Bitte beachten Sie wreckgar Kommentar, dass
enum.values()
weist ein neues array bei jedem Aufruf.InformationsquelleAutor der Antwort Oderik
Können Sie übergeben Sie ein enum als string.
Gegeben strings unterstützt werden, Sie sollten in der Lage sein, um übergeben Sie den Wert des enum-um mit kein problem.
InformationsquelleAutor der Antwort Cameron Lowell Palmer
Für die übergabe einer enum-Vorsatz können Sie konvertieren von enum in integer.
Ex:
Senden(enum integer):
Empfangen(integer enum):
Beste Grüße.
🙂
InformationsquelleAutor der Antwort TURTLE
Wenn Sie wirklich brauchen, um, Sie könnten serialisieren eines enum als String, mit
name()
undvalueOf(String)
wie folgt:Dies natürlich nicht funktionieren, wenn Ihre enums mutable Zustand (was Sie nicht sollten, wirklich).
InformationsquelleAutor der Antwort Jan Berkel
Kann es möglich sein, um Ihren Enum implementieren Serializable dann übergeben Sie es über die Absicht, wie es ist eine Methode, für die Sie ihn als serialisierbar. Die Beratung mit int anstelle von enum ist falsch. Enums verwendet werden, um Ihren code leichter zu Lesen und leichter zu pflegen. Es würde einen großen Rückschritt in das finstere Mittelalter, nicht in der Lage sein zu verwenden Enumerationen.
InformationsquelleAutor der Antwort Damien Cooke
über Oderik post:
Wenn Sie definieren eine MyEnum variable myEnum, dann tun Absicht.putExtra("Parcelable1", myEnum), Sie erhalten eine "Die Methode putExtra(String Parcelable) mehrdeutig ist für die Art Absicht" Fehlermeldung.
da gibt es auch ein Vorsatz.putExtra(String Parcelable) - Methode und die ursprüngliche 'Enum' Typ selbst implementiert das Serializable interface, so dass der compiler nicht wissen, wählen Sie, welche Methode(Vorsatz.putExtra(String Parcelable/oder Serializable)).
Schlage vor, entfernen Sie die Parcelable-Schnittstelle von MyEnum, und bewegen Sie den core-code in Wickel-Klasse " Parcelable Umsetzung, wie diese(Father2 ist ein Parcelable und enthalten ein enum-Feld):
dann können wir tun:
InformationsquelleAutor der Antwort tedzyc
können Sie enum-Konstruktor von enum zu haben primitive Datentyp..
können Sie verwenden, um pass int als extras ziehen Sie Sie dann aus dem enum deren Wert verwenden.
InformationsquelleAutor der Antwort niczm25
Mag ich einfach.
HAPPY
undSAD
.IntentFactory
schafft, dass IhreIntent
für Sie. Übergeben Sie dasMode
Sie wollen.IntentFactory
verwendet den Namen desMode
Klasse als Namen für das extra.IntentFactory
wandelt dieMode
zu einemString
mitname()
onCreate
diese Information nutzen um zu konvertieren zurück zu einemMode
.Könnten Sie
ordinal()
undMode.values()
als gut. Ich mag strings, da kann ich sehen, wie Sie in den debugger.InformationsquelleAutor der Antwort JohnnyLambada
Ich denke, Ihre beste Wette wird es sein, zu konvertieren, die diese Listen in etwas parcelable wie ein string (oder Karte?) um es zu bekommen, um die Aktivität. Dann ist die Tätigkeit, Sie zu konvertieren zurück zu einem array.
Implementierung von benutzerdefinierten parcelables ist ein Schmerz im Nacken, IMHO, also würde ich es wenn möglich vermeiden.
InformationsquelleAutor der Antwort Brad Hein
Betrachten Sie Folgende enum ::
Für Die Übergabe ::
Abrufen wieder aus der Absicht/bundle/Argumente ::
InformationsquelleAutor der Antwort muzz
Nicht verwenden Enumerationen. Grund #78 nicht zu verwenden Enumerationen. 🙂 Verwenden Sie Ganzzahlen, die leicht abgelegene, durch Bundle und Parcelable.
InformationsquelleAutor der Antwort hackbod