我有一个活动,启动时需要访问两个不同的数组列表。两个列表都是我自己创建的不同对象。

基本上,我需要一种方法来将这些对象从Intent传递给活动。我可以使用addExtras(),但这需要一个Parceable兼容类。我可以使我的类传递序列化,但据我所知,这减慢了程序。

我有什么选择?

我可以传递一个Enum吗?

题外话:有没有一种方法可以将参数从Intent传递给Activity构造函数?


当前回答

关于Oderik的帖子:

你可以让你的枚举实现Parcelable,这对枚举来说非常简单: MyEnum实现Parcelable { ... } 你可以使用Intent。Parcelable putExtra(字符串)。

如果你定义了MyEnum变量MyEnum,那么执行intent。putExtra("Parcelable1", myEnum),你会得到一个"方法putExtra(String, Parcelable)是模棱两可的类型意图"错误消息。 因为还有一个意图。putExtra(String, Parcelable)方法,和原来的'Enum'类型本身实现了Serializable接口,所以编译器不知道选择哪个方法(意图。putExtra(String, Parcelable/or Serializable))。

建议从MyEnum中删除Parcelable接口,并将核心代码移动到wrap类的Parcelable实现中,就像这样(Father2是一个Parcelable,包含一个enum字段):

public class Father2 implements Parcelable {

AnotherEnum mAnotherEnum;
int mField;

public Father2(AnotherEnum myEnum, int field) {
    mAnotherEnum = myEnum;
    mField = field;
}

private Father2(Parcel in) {
    mField = in.readInt();
    mAnotherEnum = AnotherEnum.values()[in.readInt()];
}

public static final Parcelable.Creator<Father2> CREATOR = new Parcelable.Creator<Father2>() {

    public Father2 createFromParcel(Parcel in) {
        return new Father2(in);
    }

    @Override
    public Father2[] newArray(int size) {
        return new Father2[size];
    }

};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(mField);
    dest.writeInt(mAnotherEnum.ordinal());
}

}

然后我们可以做:

AnotherEnum anotherEnum = AnotherEnum.Z;
intent.putExtra("Serializable2", AnotherEnum.X);   
intent.putExtra("Parcelable2", new Father2(AnotherEnum.X, 7));

其他回答

要按意图传递枚举,可以将enum转换为整数。

Ex:

public enum Num{A ,B}

发送(enum to integer):

Num send = Num.A;
intent.putExtra("TEST", send.ordinal());

接收(整数到enum):

Num rev;
int temp = intent.getIntExtra("TEST", -1);
if(temp >= 0 && temp < Num.values().length)
    rev = Num.values()[temp];

致以最亲切的问候。 :)

您可以将枚举作为字符串传递。

public enum CountType {
    ONE,
    TWO,
    THREE
}

private CountType count;
count = ONE;

String countString = count.name();

CountType countToo = CountType.valueOf(countString);

给定字符串的支持,你应该能够传递枚举的值没有问题。

你可以使用枚举构造函数为enum设置基本数据类型。

public enum DaysOfWeek {
    MONDAY(1),
    TUESDAY(2),
    WEDNESDAY(3),
    THURSDAY(4),
    FRIDAY(5),
    SATURDAY(6),
    SUNDAY(7);

    private int value;
    private DaysOfWeek(int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    private static final SparseArray<DaysOfWeek> map = new SparseArray<DaysOfWeek>();

    static
    {
         for (DaysOfWeek daysOfWeek : DaysOfWeek.values())
              map.put(daysOfWeek.value, daysOfWeek);
    }

    public static DaysOfWeek from(int value) {
        return map.get(value);
    }
}

你可以使用传递int作为额外参数,然后使用它的值从enum中取出它。

考虑以下enum::

public static  enum MyEnum {
    ValueA,
    ValueB
}

对于通过::

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

从intent/bundle/arguments中返回:

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

我认为最好的办法是将这些列表转换为一些可打包的东西,如字符串(或映射?),以将其传递给活动。然后Activity将不得不将其转换回数组。

实现自定义包装是一个痛苦的脖子,所以我将尽可能避免它。