一般我们在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 CREATOR = new Creator() {

@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> implements Serializable, Comparable {

... ...

}

之后你的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 CREATOR = new Parcelable.Creator() {

public Father2 createFromParcel(Parcel in) {

return new Father2(in);

}

@Override

public Father2[] newArray(int size) {

return new Father2[size];

}

};

@Override

public 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三处注释的地方,分别解注释再运行,就会认识得比较清楚了。

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

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

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

  2. android设置过滤文件类型,Android之Intent筛选多种类型文件

    在项目中,经常遇到需要选择指定类型的文件. 指定一种类型的文件 我们一般是使用setType来实现过滤 例如,只显示pdf文件 int requestCode = 100; Intent intent ...

  3. 【转】Android 之最新最全的Intent传递数据方法

    原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...

  4. Intent打开各种类型的文件

    需要用到Intent.setDataAndType(path,type)函数 模板: //android获取一个用于打开PPT文件的intent   public static Intent getP ...

  5. Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)

    一.什么是Intent? Intent的中文意思是目的.在Android中也是"目的"的意思.就是我们要去哪里,从这个activity要前往另一个Activity就需要用到Inte ...

  6. Android学习记录(7)—Intent中显示意图和隐式意图的用法

    Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的 ...

  7. android用于打开各种文件的intent

    import android.app.Activity;   import android.content.Intent;   import android.net.Uri; import andro ...

  8. Android总结篇系列:Activity Intent Flags及Task相关属性

    同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 ...

  9. c++ enum 枚举类型

    enum 枚举类型 限定作用域的枚举类型(class) enum class open_modes { input, output, append }; 不限定作用域的枚举类型 enum color ...

最新文章

  1. python 玩公众号游戏_Python入门太难?不如从玩塔防小游戏开始,玩通关就能学会编程...
  2. 一个项目从开工到交付使用需要经历的过程
  3. pycharm debug 断点调试
  4. js的深浅拷贝( 赋值后原值被覆盖的问题 )
  5. 张震博士:SDT是未来安防发展方向
  6. ZT:Java代码编写的30条建议
  7. java unit test怎么写_Java J Unit Test
  8. MySQL高级知识(十一)——Show Profile
  9. 如果 GitHub 被中国互联网巨头收购会怎样?
  10. ps分辨率像素英寸和厘米的区别_PS萌新必知的专业术语
  11. mysql x锁 u锁_讲解更新锁(U)与排它锁(X)的相关知识
  12. 从0开始安卓开发之路_Android Studio安装包
  13. 一个问题,被人问是否确定,千万不要随口回答确定
  14. Mac电脑使用svn下载版本
  15. Flash游戏开发中的人物走动实现方法
  16. VR全景智慧城市虚拟现实三维的发展
  17. HAOI2017 简要题解
  18. Codeforces1153——D. Serval and Rooted Tree(思维好题+dfs+贪心)
  19. 乌班图linux怎么连手机热点,ubuntu 16.04 设置位wifi热点 方法(手机可链接)亲测可用...
  20. Tools —— 以管理员身份运行bat文件闪退

热门文章

  1. Matlab 生成vhdl,matlab - 使用HDL Workflow Advisor将Matlab代码转换为vhdl - 堆栈内存溢出...
  2. mysql数据库 day03
  3. Java发送Post请求,参数JSON,接收JSON
  4. [SHOI2009] 会场预约
  5. dijkstra堆优化(multiset实现-大大减小代码量)
  6. 统计进仓和出仓数量随时间变化的剩余数量流程图
  7. JDK和JRE它们之间的关系及区别
  8. ASP.NET入门教程:服务器控件
  9. 2020年最前沿的 8 本AI技术图书—文末留言赠8本
  10. C语言读取图像像素坐标,求指导,如何用c语言实现读取*.raw格式图像