enum类型被intent所携带时需要注意的地方
来源:互联网 发布:java jdk 1.7 64 编辑:程序博客网 时间:2024/05/06 07:34
一般我们在Activity之间传递对象时多用Parcelable。比如写一个class,在这个class上标明implements Parcelable并实现接口就可以用Intent.putExtra(String, Parcelable)了。对于传递enum对象,假设也采用此方法,即像http://stackoverflow.com/questions/2836256/passing-enum-or-object-through-an-intent-the-best-solution里面3楼说的:
public enum MyEnum implements Parcelable { VALUE; @Override public int describeContents() { return 0; } @Override public void writeToParcel(final Parcel dest, final int flags) { dest.writeInt(ordinal()); } public static final Creator<MyEnum> CREATOR = new Creator<MyEnum>() { @Override public MyEnum createFromParcel(final Parcel source) { return MyEnum.values()[source.readInt()]; } @Override public MyEnum[] newArray(final int size) { return new MyEnum[size]; } };}You can than use Intent.putExtra(String, Parcelable).
那么我们先定义一个MyEnum变量a,再调用intent.putExtra("name", a),会报The method putExtra(String, Parcelable) is ambiguous for the type Intent的错,为何?
因为enum自身实现了Serializable接口,Enum类的源代码里这么写的:
public abstract class Enum<E extends Enum<E>> implements Serializable, Comparable<E> {... ...}
之后你的MyEnum类再实现Parcelable接口,而intent里面有这样两个函数:Intent.putExtra(String, Parcelable)和Intent.putExtra(String, Serializable),你的MyEnum类实现了Serializable和Parcelable两个接口,在调用Intent.putExtra时,编译器就不知道该选Intent.putExtra(String, Parcelable)还是Intent.putExtra(String, Serializable),导致二义性。那么上面的说法是否真的无用? 其实这种写法在MyEnum对象作为类Father1的成员时还是可以这么写的,我们在Activity间传Father1,Father1是可以实现Parcelable接口的。Father1内部处理MyEnum成员时可以这样:
private Father1(Parcel in) { mField = in.readInt(); mMyEnum = MyEnum.CREATOR.createFromParcel(in);}public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mField); mMyEnum.writeToParcel(dest, flags);}
经测试,也可以把enum传递出去。
既然上述MyEnum的写法可以适应enum作为Parcelable类成员来传递,而不能作为单独的对象来传递,要兼得二者该如何做?
首先,MyEnum不需实现Parcelable接口,单独传递MyEnum对象时就用Intent.putExtra(String, Serializable)。
然后把MyEnum的createFromParcel()和writeToParcel()的代码整合进Father类,代码片段(变量名有改动):
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]; }};@Overridepublic void writeToParcel(Parcel dest, int flags) { dest.writeInt(mField); dest.writeInt(mAnotherEnum.ordinal());}
再用Intent.putExtra(String, Parcelable)来传Father2对象就可以了。
再谈一下Enum类的values()方法,这个方法是无法通过eclipse查看到的,它的定义在这里,它返回所有的定义过的枚举值,enum的底层实现就是定义从0到N的数个整数,只不过为每个整数取了个别名,一个enum变量就是这数个整数之一,这个enum变量的ordinal()方法就是返回其在这数个整数中的位置。values()静态方法返回一个包含这数个整数的数组。
给出示例代码(免积分下载),在MainActivity.java三处注释的地方,分别解注释再运行,就会认识得比较清楚了。
- enum类型被intent所携带时需要注意的地方
- 调用隐式intent需要注意的地方。
- intent传递Parcelable类型数据要注意的地方
- 需要注意的地方
- 需要注意的地方
- 需要注意的地方
- 指针的类型(需要注意的一些地方)
- JAVA 泛型的类型参数需要注意的地方
- Oracle日期类型Date和timestamp需要注意的地方
- android 混淆时需要注意的地方
- 开发ALV时,需要注意的地方
- 使用setById时需要注意的地方
- 写lua时需要注意的地方
- 使用nusoap时需要注意的地方
- oracle查询时需要注意的地方
- 重写equals时需要注意的地方
- 比赛时需要注意的几个地方
- C# 引用类型作为函数参数时一些需要注意的地方
- 8.NBS/ISCC 色名表示法 267 非发光体标准色
- bign类C++高精度模板
- python 手机号码归属 ip地址查询
- NSThread exit 方法
- VLC源码分析(二)
- enum类型被intent所携带时需要注意的地方
- TS流 PS流 ES流
- VLC源码分析(一)
- Groovy – 1
- 2012-12-22
- H.264 RTP payload 格式
- 总算知道原因了
- SDP概述
- 安装、卸载homebrew for osx