Android: Wie fügt man ein Enum in ein Bundle ein?

Lesezeit: 5 Minuten

Benutzer-Avatar
zer0stimulus

Wie fügen Sie einem Android-Bundle ein Enum-Objekt hinzu?

  • 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

Benutzer-Avatar
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


Benutzer-Avatar
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");

Benutzer-Avatar
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))

Benutzer-Avatar
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


Benutzer-Avatar
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


Benutzer-Avatar
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];
    }
}

1351950cookie-checkAndroid: Wie fügt man ein Enum in ein Bundle ein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy