404 Stimmen

Android: Wie füge ich eine Enum in ein Bundle ein?

Wie fügt man ein Enum-Objekt zu einem Android-Bundle hinzu?

6voto

Charlie Jones Punkte 61

Eine andere Möglichkeit:

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());
    }
}

5voto

vitiello.antonio Punkte 287

In Kotlin:

enum class MyEnum {
  NAME, SURNAME, GENDER
}

Fügen Sie diese Aufzählung in ein Bundle ein:

Bundle().apply {
  putInt(MY_ENUM_KEY, MyEnum.ordinal)
}

Enum von Bundle holen:

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

4voto

Moises Portillo Punkte 748

Ich habe eine Koltin-Erweiterung erstellt:

fun Bundle.putEnum(key: String, enum: Enum<*>) {
    this.putString( key , enum.name )
}

inline fun <reified T: Enum<T>> Intent.getEnumExtra(key:String) : T {
    return enumValueOf( getStringExtra(key) )
}

Erstellen Sie ein Bündel und fügen Sie es hinzu:

Bundle().also {
   it.putEnum( "KEY" , ENUM_CLAS.ITEM )
}

und erhalten:

intent?.getEnumExtra< ENUM_CLAS >( "KEY" )?.let{}

2voto

Gotcha Punkte 25

Verwenden Sie bundle.putSerializable(String key, Serializable s) und bundle.getSerializable(String key):

enum Mode = {
  BASIC, ADVANCED
}

Mode m = Mode.BASIC;

bundle.putSerializable("mode", m);

...

Mode m;
m = bundle.getSerializable("mode");

Dokumentation: http://developer.Android.com/reference/Android/os/Bundle.html

1voto

Rasoul Miri Punkte 7020

Für Absicht können Sie auf diese Weise verwenden:

Absicht : kotlin

FirstActivity :

val intent = Intent(context, SecondActivity::class.java)
intent.putExtra("type", typeEnum.A)
startActivity(intent)

SecondActivity:

override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState) 
     //...
     val type = (intent.extras?.get("type") as? typeEnum.Type?)
}

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