Wie fügen Sie einem Android-Bundle ein Enum-Objekt hinzu?
Android: Wie fügt man ein Enum in ein Bundle ein?
zer0stimulus
miguel
Aufzählungen sind serialisierbar, daher gibt es kein Problem.
Angesichts der folgenden Aufzählung:
enum YourEnum {
TYPE1,
TYPE2
}
Bündeln:
// put
bundle.putSerializable("key", YourEnum.TYPE1);
// get
YourEnum yourenum = (YourEnum) bundle.get("key");
Absicht:
// put
intent.putExtra("key", yourEnum);
// get
yourEnum = (YourEnum) intent.getSerializableExtra("key");
-
Stimmt etwas mit dieser Methode nicht: Speichern:
outState.putSerializable("trollData", game.getFunkyTrolls());
Wird geladen:game.setFunkyTrolls((Game.FunkyTroll[]) savedInstanceState.getSerializable("trollData"));
?– Möberg
22. Mai 2013 um 12:03 Uhr
-
Ich hätte für Ihre Antwort gestimmt, aber die Frage betraf das Hinzufügen der Enum zu einem Bundle und Ihre Antwort erklärt, wie man sie zu einer Absicht hinzufügt … Zugegeben, es ist fast dasselbe, aber Alejandro unten hat Ihre Antwort korrigiert.
– Pooks
27. September 2013 um 5:34 Uhr
-
wenn es mit Bundle verwendet wird, wirft es
ClassNotFoundException
– Anzeigename
23. März 2014 um 20:28 Uhr
-
Dies kann sehr langsam sein und skaliert nicht auf Arrays von Dingen, die Enum usw. enthalten. Siehe stackoverflow.com/a/5551155/175156
– Yinkrash
18. Juni 2014 um 19:30 Uhr
-
@yincrash enum verwendet eine benutzerdefinierte Serialisierung, die ziemlich schnell ist. Nachweisen: docs.oracle.com/javase/1.5.0/docs/guide/serialization/spec/…
– Miha_x64
19. August 2017 um 10:14 Uhr
Ich weiß, dass dies eine alte Frage ist, aber ich bin mit demselben Problem gekommen und möchte mitteilen, wie ich es gelöst habe. Der Schlüssel ist, was Miguel sagte: Enums sind serialisierbar.
Angesichts der folgenden Aufzählung:
enum YourEnumType {
ENUM_KEY_1,
ENUM_KEY_2
}
Stellen:
Bundle args = new Bundle();
args.putSerializable("arg", YourEnumType.ENUM_KEY_1);
-
Basierend darauf: stackoverflow.com/questions/15521309/…, benutzerdefinierte Enums sind nicht serialisierbar. Die benutzerdefinierten Felder in einem Enum werden also nicht serialisiert. Wie gehen Sie damit um?
– erschüttert
8. Januar 2015 um 19:03 Uhr
-
Gute Frage @clu! Vielleicht sollten Sie dann daran denken, es als Zeichenfolge weiterzugeben, wie in stackoverflow.com/questions/609860/…
– Alejandro Colorado
11. Januar 2015 um 2:07 Uhr
-
@clu Indem Sie nicht erwarten, dass benutzerdefinierte Felder serialisiert werden. Es funktioniert gut, wenn es nur eine normale Aufzählung wie im obigen Code ist.
– blau hallu
11. Januar 2016 um 12:39 Uhr
-
@AlejandroColorado was fügt dies zu Miguels Antwort hinzu?
– tir38
17. Mai 2016 um 23:28 Uhr
-
Miguels Antwort wurde 2015 bearbeitet. Die ursprüngliche Antwort sagte nichts über Bundles, sie zeigte nur ein Beispiel für eine Absicht.
– Alejandro Colorado
17. Mai 2016 um 23:30 Uhr
Das es
Der Vollständigkeit halber ist dies ein vollständiges Beispiel dafür, wie Sie eine Aufzählung aus einem Bündel einfügen und zurückerhalten.
Angesichts der folgenden Aufzählung:
enum EnumType{
ENUM_VALUE_1,
ENUM_VALUE_2
}
Sie können die Aufzählung in ein Bündel packen:
bundle.putSerializable("enum_key", EnumType.ENUM_VALUE_1);
Und holen Sie sich die Aufzählung zurück:
EnumType enumType = (EnumType)bundle.getSerializable("enum_key");
Wladislav
Ich benutze Kotlin.
companion object {
enum class Mode {
MODE_REFERENCE,
MODE_DOWNLOAD
}
}
dann in Intent setzen:
intent.putExtra(KEY_MODE, Mode.MODE_DOWNLOAD.name)
wenn Sie netto Wert bekommen:
mode = Mode.valueOf(intent.getStringExtra(KEY_MODE))
Benutzer602359
Es kann besser sein, es als String von myEnumValue.name() zu übergeben und es von YourEnums.valueOf(s) wiederherzustellen, da sonst die Reihenfolge der Aufzählung beibehalten werden muss!
Längere Erklärung: Konvertieren von Aufzählungsordnungszahl in Aufzählungstyp
-
Die Reihenfolge spielt keine Rolle, wenn die Serialisierung -> Deserialisierung sofort zur Laufzeit erfolgt, z. B. beim Aufrufen von einer Aktivität zu einer anderen. Es könnte ein Problem bei Prozessen wie dem Senden von Intents von einer App an eine ältere Version der App sein.
– miguel
9. Juni 2016 um 5:27 Uhr
Stich
Andere Option:
public enum DataType implements Parcleable {
SIMPLE, COMPLEX;
public static final Parcelable.Creator<DataType> CREATOR = new Creator<DataType>() {
@Override
public DataType[] newArray(int size) {
return new DataType[size];
}
@Override
public DataType createFromParcel(Parcel source) {
return DataType.values()[source.readInt()];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.ordinal());
}
}
-
Die Reihenfolge spielt keine Rolle, wenn die Serialisierung -> Deserialisierung sofort zur Laufzeit erfolgt, z. B. beim Aufrufen von einer Aktivität zu einer anderen. Es könnte ein Problem bei Prozessen wie dem Senden von Intents von einer App an eine ältere Version der App sein.
– miguel
9. Juni 2016 um 5:27 Uhr
vitiello.antonio
In Kotlin:
enum class MyEnum {
NAME, SURNAME, GENDER
}
Setzen Sie diese Aufzählung in ein Bündel:
Bundle().apply {
putInt(MY_ENUM_KEY, MyEnum.ordinal)
}
Aufzählung von Bundle erhalten:
val ordinal = getInt(MY_ENUM_KEY, 0)
MyEnum.values()[ordinal]
Vollständiges Beispiel:
class MyFragment : Fragment() {
enum class MyEnum {
NAME, SURNAME, GENDER
}
companion object {
private const val MY_ENUM_KEY = "my_enum_key"
fun newInstance(myEnum: MyEnum) = MyFragment().apply {
arguments = Bundle().apply {
putInt(MY_ENUM_KEY, myEnum.ordinal)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
with(requireArguments()) {
val ordinal = getInt(MY_ENUM_KEY, 0)
val myEnum = MyEnum.values()[ordinal]
}
}
}
In Java:
public final class MyFragment extends Fragment {
private static final String MY_ENUM_KEY = "my_enum";
public enum MyEnum {
NAME,
SURNAME,
GENDER
}
public final MyFragment newInstance(MyEnum myEnum) {
Bundle bundle = new Bundle();
bundle.putInt(MY_ENUM_KEY, myEnum.ordinal());
MyFragment fragment = new MyFragment();
fragment.setArguments(bundle);
return fragment;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle arguments = this.requireArguments();
int ordinal = arguments.getInt(MY_ENUM_KEY, 0);
MyEnum myEnum = MyEnum.values()[ordinal];
}
}
Meiner Meinung nach ist dieser Rat von Google-Mitarbeitern schlecht. Enums sind sehr praktisch und es lohnt sich, den beschriebenen Overhead zu erleiden.
– ognisch
20. Juli 2010 um 18:24 Uhr
Können Sie die Antworten noch einmal durchgehen und die zweite akzeptieren, wenn Sie der Meinung sind, dass dies die bessere Wahl sein könnte?
– Philipp
6. September 2012 um 19:43 Uhr
Unter der Überschrift „Avoiding Enums“ im obigen Link heißt es nun: Performance-Mythen Frühere Versionen dieses Dokuments haben verschiedene irreführende Behauptungen aufgestellt. Auf einige davon gehen wir hier ein.
– Stapelüberlauf
2. Oktober 2012 um 11:00 Uhr
dieser Abschnitt ist nicht einmal mehr vorhanden.
– Nathaniel D. Waggoner
30. Januar 2014 um 21:58 Uhr
mögliches Duplikat von Passing enum or object through an intention (die beste Lösung)
– Pablisko
3. März 2014 um 11:27 Uhr