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

2023-05-16

        一般我们在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];
    }

};

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 聚合类新闻客户端初体验

    初体验的产品 xff1a 今日头条 ios3 6 百度新闻 ios4 4 0 ZAKER ios4 4 5 鲜果 ios3 8 7 中搜搜悦 ios4 0 1 Flipboard ios2 3 9 1 Flipboard 一款国外很火的ap
  • 聚合类新闻客户端的改进

    zaker和鲜果是最早的聚合类新闻产品 xff0c 前几年发展很快 xff0c 迅速占领了市场 xff0c 但近两年发展变得缓慢 xff0c 而今日头条自发布以来才两年 xff0c 用户量就迅速超过了zaker和鲜果 xff0c 使用起来非
  • 单例模式优缺点

    主要优点 xff1a 1 提供了对唯一实例的受控访问 2 由于在系统内存中只存在一个对象 xff0c 因此可以节约系统资源 xff0c 对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能 3 允许可变数目的实例 主要缺点 xff
  • 适配器模式优缺点

    优点 xff1a 1 将目标类和适配者类解耦 2 增加了类的透明性和复用性 xff0c 将具体的实现封装在适配者类中 xff0c 对于客户端类来说是透明的 xff0c 而且提高了适配者的复用性 3 灵活性和扩展性都非常好 xff0c 符合开
  • Oracle 的 Round函数

    Round函数用法 xff1a 截取数字 格式如下 xff1a ROUND xff08 number decimals xff09 其中 xff1a number 待做截取处理的数值 decimals 指明需保留小数点后面的位数 可选项 x
  • eclipse报错:Failed to load the JNI shared library

    电脑自装系统以来 xff0c 好久没有写java代码了 xff0c 所以一直也没用 eclipse IDE xff0c 今天将eclipse打开 xff0c 报了个问题 xff0c Failed to load the JNI shared
  • 10串口通信

    51单片机学习记录10 通信通信的的基本概念串口参数及时序图常用通信接口比较 51单片机串口介绍串口通信简介串口内部结构串口通信相关寄存器 串口通信实验串口向计算机发送数据计算机通过串口控制LED 通信 通信的的基本概念 通信的方式 通信方
  • 【已解决】zookeeper配置出现问题合集

    已解决 zookeeper配置出现问题合集 1 问题诊断 日志2 问题解决合集2 1zookeeper集群搭建报错 拒绝连接 2 2zookeeper集群搭建报错 没有找到主机路由 1 问题诊断 日志 1 进入文件查看日志 xff1a zo
  • noVNC 安装、配置与使用

    最近项目中使用到了远程终端操控 xff0c 从各方找到了noVNC这个神奇的家伙 xff0c 废话不多说 xff0c 开始介绍它的安装配置与使用 1 下载noNVC 好多渠道可以下载到noVNC xff0c 可以直接访问noVNC的官方网页
  • 360极速浏览器网页保护色

    方法一 xff1a 360浏览器的 扩展中心 有一个 绿色眼睛 的插件 xff1b 但是感觉一般 xff0c 不够彻底 xff1b 方法二 xff1a 360急速浏览器是基于开源Chrome浏览器修改的 xff0c 所以可以直接用Chrom
  • STM32基于FreeRTOS的多任务程序案例

    STM32基于FreeRTOS的多任务程序案例 一 初步了解FreeRTOS二 实验要求三 基于FreeRTOS的多任务程序案例四 参考链接 使用工具 野火stm32mini开发板 Keil uVision5 野火多功能调试助手 一 初步了
  • 【TcaplusDB知识库】TcaplusDB刷新tbus通道介绍

    命令 xff1a RefreshBusCfg 其中 xff0c 指进程的进程id xff0c 比如1 2 2 2 1 2 1 2等 xff0c 也支持简单的正则表达式 xff0c 比如RefreshBusCfg 1 2 2 那么只要匹配到1
  • Python中下划线的5种含义

    作者 xff1a 地球的外星人君 链接 xff1a https zhuanlan zhihu com p 36173202 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 分享一篇文章
  • ubuntu下 安装PX4编译环境

    最近博主的ubuntu虚拟机再次崩溃 xff0c 狠下决心将4G内存升级为12G 这样就可以给虚拟机多分配些内存了 鉴于前两次安装PX4环境出现了很多错误 xff0c 走了很多弯路 xff0c 没有一一记录下来 xff0c 所获甚少 故而借
  • PX4原生固件,position_estimator_inav解读

    INAV integrated navigation组合导航 对于多旋翼的位置姿态估计系统 xff1a PX4原生固件如今已经默认使用EKF2了 xff0c 另一种情况是 使用local position estimator attitud
  • FusionCharts Free (FCF) 版本 v3.0 更新细节

    版本 v3 0 更新细节 1 新的图表类型 滚动图 柱二维 xff0c 二维和区系的二维 xff0c 堆栈柱二维 xff0c 二维结合 xff0c 结合二维 xff08 双 Y 轴 xff09 样图 样条区域图 对数坐标图 二维多图单 组合
  • dwm-1000 测距总是出现 #define SYS_STATUS_RXPTO 0x00200000UL /* Preamble detection timeout */

    ex 05b ds twr resp 程序 总是出现 致使官方的代码 无法实现通讯 define SYS STATUS RXPTO 0x00200000UL Preamble detection timeout 需要着重修改参数
  • VNC远程桌面到linux,提示connection refused(10061)解决办法

    确认server端的VNC服务开启 xff0c service vncserver start xff0c 检测状态时ok的 ps ef grep vnc xff0c 来查看不是已经开启多个vnc连接 如果有多个vnc连接 xff0c 使用
  • uio驱动框架

    核心 xff0c 利用mmap进行映射 参考资料 uio 编写实例 1 https blog csdn net wujiangguizhen article details 12453253 uio编写实例 2 https blog csd
  • enum类型被intent所携带时需要注意的地方

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