256 Stimmen

Übergabe von Enum oder Objekt durch einen Intent (die beste Lösung)

Ich habe eine Aktivität, die beim Start Zugriff auf zwei verschiedene ArrayLists benötigt. Beide Listen sind unterschiedliche Objekte, die ich selbst erstellt habe.

Grundsätzlich benötige ich eine Möglichkeit, diese Objekte von einem Intent an die Aktivität zu übergeben. Ich kann addExtras() verwenden, aber dies erfordert eine Parceable kompatible Klasse. Ich könnte meine Klassen zu serializable übergeben werden, aber wie ich verstehe, verlangsamt dies das Programm.

Welche Möglichkeiten habe ich?

Kann ich eine Enum übergeben?

Nebenbei bemerkt: Gibt es eine Möglichkeit, Parameter an einen Activity Constructor aus einem Intent zu übergeben?

0voto

Brad Hein Punkte 10909

Ich denke, die beste Lösung ist, diese Listen in etwas Paketierbares wie eine Zeichenkette (oder eine Karte?) zu konvertieren, um sie an die Aktivität zu übergeben. Dann muss die Activity sie wieder in ein Array konvertieren.

Die Implementierung von benutzerdefinierten parcelables ist ein Schmerz im Nacken IMHO so würde ich es vermeiden, wenn möglich.

0voto

muzz Punkte 4284

Betrachten Sie folgendes enum ::

public static  enum MyEnum {
    ValueA,
    ValueB
}

Für das Bestehen ::

 Intent mainIntent = new Intent(this,MyActivity.class);
 mainIntent.putExtra("ENUM_CONST", MyEnum.ValueA);
 this.startActivity(mainIntent);

Zurückholen von intent/bundle/arguments ::

 MyEnum myEnum = (MyEnum) intent.getSerializableExtra("ENUM_CONST");

0voto

MHN Punkte 11

Wenn Sie nur eine Aufzählung senden wollen, können Sie etwas wie folgt tun:

Deklarieren Sie zunächst eine Aufzählung, die einen Wert enthält (der über intent übergeben werden kann):

 public enum MyEnum {
    ENUM_ZERO(0),
    ENUM_ONE(1),
    ENUM_TWO(2),
    ENUM_THREE(3);
    private int intValue;

    MyEnum(int intValue) {
        this.intValue = intValue;
    }

    public int getIntValue() {
        return intValue;
    }

    public static MyEnum getEnumByValue(int intValue) {
        switch (intValue) {
            case 0:
                return ENUM_ZERO;
            case 1:
                return ENUM_ONE;
            case 2:
                return ENUM_TWO;
            case 3:
                return ENUM_THREE;
            default:
                return null;
        }
    }
}

Dann:

  intent.putExtra("EnumValue", MyEnum.ENUM_THREE.getIntValue());

Und wann Sie es bekommen wollen:

  NotificationController.MyEnum myEnum = NotificationController.MyEnum.getEnumByValue(intent.getIntExtra("EnumValue",-1);

Ein Kinderspiel!

0voto

Gibolt Punkte 32347

Kotlin-Erweiterungsfunktionen verwenden

inline fun <reified T : Enum<T>> Intent.putExtra(enumVal: T, key: String? = T::class.qualifiedName): Intent =
    putExtra(key, enumVal.ordinal)

inline fun <reified T: Enum<T>> Intent.getEnumExtra(key: String? = T::class.qualifiedName): T? =
    getIntExtra(key, -1)
        .takeUnless { it == -1 }
        ?.let { T::class.java.enumConstants[it] }

Dies gibt Ihnen die Flexibilität, mehrere Exemplare desselben Enum-Typs zu übergeben oder standardmäßig den Klassennamen zu verwenden.

// Add to gradle
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

// Import the extension functions
import path.to.my.kotlin.script.putExtra
import path.to.my.kotlin.script.getEnumExtra

// To Send
intent.putExtra(MyEnumClass.VALUE)

// To Receive
val result = intent.getEnumExtra<MyEnumClass>()

-2voto

hackbod Punkte 89543

Verwenden Sie keine Enums. Grund #78, keine Enums zu verwenden :) Verwenden Sie Integer, die leicht durch Bundle und Parcelable entfernt werden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X