一般我们在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楼说的:

[java] view plaincopy
  1. public enum MyEnum implements Parcelable {
  2. VALUE;
  3. @Override
  4. public int describeContents() {
  5. return 0;
  6. }
  7. @Override
  8. public void writeToParcel(final Parcel dest, final int flags) {
  9. dest.writeInt(ordinal());
  10. }
  11. public static final Creator<MyEnum> CREATOR = new Creator<MyEnum>() {
  12. @Override
  13. public MyEnum createFromParcel(final Parcel source) {
  14. return MyEnum.values()[source.readInt()];
  15. }
  16. @Override
  17. public MyEnum[] newArray(final int size) {
  18. return new MyEnum[size];
  19. }
  20. };
  21. }
  22. 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类的源代码里这么写的:

[java] view plaincopy
  1. public abstract class Enum<E extends Enum<E>> implements Serializable, Comparable<E> {
  2. ... ...
  3. }

之后你的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成员时可以这样:

[java] view plaincopy
  1. private Father1(Parcel in) {
  2. mField = in.readInt();
  3. mMyEnum = MyEnum.CREATOR.createFromParcel(in);
  4. }
  5. public void writeToParcel(Parcel dest, int flags) {
  6. dest.writeInt(mField);
  7. mMyEnum.writeToParcel(dest, flags);
  8. }

经测试,也可以把enum传递出去。

既然上述MyEnum的写法可以适应enum作为Parcelable类成员来传递,而不能作为单独的对象来传递,要兼得二者该如何做?

首先,MyEnum不需实现Parcelable接口,单独传递MyEnum对象时就用Intent.putExtra(String, Serializable)。

然后把MyEnum的createFromParcel()和writeToParcel()的代码整合进Father类,代码片段(变量名有改动):

[java] view plaincopy
  1. private Father2(Parcel in) {
  2. mField = in.readInt();
  3. mAnotherEnum = AnotherEnum.values()[in.readInt()];
  4. }
  5. public static final Parcelable.Creator<Father2> CREATOR = new Parcelable.Creator<Father2>() {
  6. public Father2 createFromParcel(Parcel in) {
  7. return new Father2(in);
  8. }
  9. @Override
  10. public Father2[] newArray(int size) {
  11. return new Father2[size];
  12. }
  13. };
  14. @Override
  15. public void writeToParcel(Parcel dest, int flags) {
  16. dest.writeInt(mField);
  17. dest.writeInt(mAnotherEnum.ordinal());
  18. }

再用Intent.putExtra(String, Parcelable)来传Father2对象就可以了。

再谈一下Enum类的values()方法,这个方法是无法通过eclipse查看到的,它的定义在这里,它返回所有的定义过的枚举值,enum的底层实现就是定义从0到N的数个整数,只不过为每个整数取了个别名,一个enum变量就是这数个整数之一,这个enum变量的ordinal()方法就是返回其在这数个整数中的位置。values()静态方法返回一个包含这数个整数的数组。

给出示例代码(免积分下载),在MainActivity.java三处注释的地方,分别解注释再运行,就会认识得比较清楚了。

enum类型被intent所携带时需要注意的地方相关推荐

  1. android intent enum,enum类型被intent所携带时需要注意的地方

    一般我们在Activity之间传递对象时多用Parcelable.比如写一个class,在这个class上标明implements Parcelable并实现接口就可以用Intent.putExtra ...

  2. Intent传递数据时,可以传递哪些类型数据

    Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选) A.Serializable  B.charsequence C.Parcelable  D.Bundle 除了上面的还能传递 ...

  3. mysql中enum类型

    ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串("") 或 NULL: 如果 ...

  4. MYSQL中 ENUM 类型

    MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...

  5. mysql 枚举_是否推荐使用MySQL的enum类型?

    使用 MySQL ENUM 作为列的数据类型有两个主要的好处,一是使得数据更紧凑进而节省空间,二是更好的可阅读性.但是,享受这些好处的同时,也要承担 ENUM 所带来的各种负面影响. 我们罗列几个主要 ...

  6. mysql enum_MySQL数据库中关于ENUM类型的详细解释

    MySQL数据库中,因为工作的需求,我们可能会用到ENUM类型,但是由于此类型不是很常用,我们可能对其也不是很了解.没关系,本文我们就对ENUM类型做一些详细的解释,希望能够对您有所帮助. ENUM类 ...

  7. set和enum类型的用法和区别

    mysql中的set和enum类型的用法和区别 mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值.   1 2 3 ...

  8. enum mysql byte_九、臭名昭著的 MySQL ENUM 类型 ( 上 )

    MySQL 中,对于那些取值只有两三个,或者五个以内的值,想必,大多数人使用的应该都是 ENUM 类型吧,而剩下的另一部分人,应该都是使用 TINYINT(1) . 我,就是剩下的那部分人. 一方面我 ...

  9. mysql 5.7 enum_MYSQL中 ENUM 类型的详细解释

    ENUM 类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串( "" ) 或 NULL ...

最新文章

  1. 除了数据还是数据?2018年5大 AI (人工智能)预测
  2. 2020 年最强大的 10 门编程语言
  3. Lintcode132 Word Search || solution 题解
  4. 第四章-分布式数据库HBase
  5. python炫酷特效代码_推荐几个炫酷的 Python 开源项目
  6. 论文浅尝 | 知识图谱中的链接预测:一种基于层次约束的方法
  7. 一个HTTP请求,把网站打裂开了!
  8. css3自适应 fill-available、fit-content、max-content、min-content
  9. 网易云api普通评论爬取的反馈
  10. 有限元分析的基本知识 (一份培训资料) (1)
  11. Minimax Problem
  12. 微分方程_e的矩阵指数
  13. 如何成为Android高手
  14. [JQuery]关于使用jsp:include标签及%@ include标签时要注意的事项
  15. 《管理学》期末第一次复习
  16. springboot连接远程Redis
  17. 动态改变UITableView中的Cell高度
  18. linux下的c语言实现象棋,用c语言+API制作象棋界面
  19. Visual.Assist.X.10.9.Build.2375.0 2020.05.16 最新版
  20. 处理筛选CelebA人脸数据集

热门文章

  1. Android新手系列教程(申明:来源于网络)
  2. iOS - OC 术语表
  3. matlab和C/C++混合编程--Mex
  4. DotNetNuke(DNN)升级攻略(DNN 4.3.7至DNN 4.6.0)
  5. 一文看懂深度学习与计算机视觉
  6. Gabor滤波小结整理
  7. 视频直播技术详解(3)编码和封装
  8. 微软人工智能平台开源:利用《我的世界》测试AI软件
  9. 计算机视觉目标检测的框架与过程
  10. python--二进制的用法