使用 Parcelable 在 Intent 中传递数组

2023-12-10

我想在活动之间发送一系列对象。我想使用 Parcelable 接口并以意图发送数据。但是我不断收到错误。我已经被困了2天了。以下是有关我的问题的一些详细信息。

Class A

private ProjetUI[] mProjects;

private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Context context = view.getContext();
        Intent intent = new Intent(context, ProjetListActivity.class);
        intent.putExtra(ProjetListActivity.ARG_PROJECTS, mProjects);
        context.startActivity(intent);
    }
};

Class B

ProjetUI[] mProjects = getIntent().getParcelableArrayExtra(ARG_PROJECTS);

我收到编译错误“类型不兼容” 转换为 (ProjetUI[]) 后,出现运行时错误“无法将 Parcelable[] 转换为 ProjetUI[]”

类项目

public class ProjetUI implements Parcelable {

private String id;
private String idParent;
private String nom;
private String description;
private List<ProjetColonneUI> colonnes;
private List<VueUI> vues;
private boolean archive;
private String version;
private String commentaire;
private boolean published;
private List<DroitAccesUI> droitAcces;
private String idDossier;
private String typeDossier;
private String idModele;
private List<ProjetDatasetUI> projetDatasets;

protected ProjetUI(Parcel in) {
    id = in.readString();
    idParent = in.readString();
    nom = in.readString();
    description = in.readString();
    colonnes = in.createTypedArrayList(ProjetColonneUI.CREATOR);
    vues = in.createTypedArrayList(VueUI.CREATOR);
    archive = in.readInt() == 1;
    version = in.readString();
    commentaire = in.readString();
    published = in.readInt() == 1;
    droitAcces = in.createTypedArrayList(DroitAccesUI.CREATOR);
    idDossier = in.readString();
    typeDossier = in.readString();
    idModele = in.readString();
    projetDatasets = in.createTypedArrayList(ProjetDatasetUI.CREATOR);
}

public static final Creator<ProjetUI> CREATOR = new Creator<ProjetUI>() {
    @Override
    public ProjetUI createFromParcel(Parcel in) {
        return new ProjetUI(in);
    }

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

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

@Override
public void writeToParcel(Parcel parcel, int flags) {
    parcel.writeString(getId());
    parcel.writeString(getIdParent());
    parcel.writeString(getNom());
    parcel.writeString(getDescription());
    parcel.writeTypedList(getColonnes());
    parcel.writeTypedList(getVues());
    parcel.writeInt(isArchive() ? 1 : 0);
    parcel.writeString(getVersion());
    parcel.writeString(getCommentaire());
    parcel.writeInt(isPublished() ? 1 : 0);
    parcel.writeTypedList(getDroitAcces());
    parcel.writeString(getIdDossier());
    parcel.writeString(getTypeDossier());
    parcel.writeString(getIdModele());
    parcel.writeTypedList(getProjetDatasets());
}
}

EDIT

这是完整的堆栈跟踪

其他类像 ProjeUI 类一样实现 Parcelable。 这是另一个具有枚举类型的类的示例,以及实现 Parcelable 的枚举的示例

public class VueRelationUI implements Parcelable {

private String id;
private String idVue;
private String idRelation;
private RelationType typeRelation;

protected VueRelationUI(Parcel in) {
    id = in.readString();
    idVue = in.readString();
    idRelation = in.readString();
    typeRelation = in.readParcelable(RelationType.class.getClassLoader());
}

public static final Creator<VueRelationUI> CREATOR = new Creator<VueRelationUI>() {
    @Override
    public VueRelationUI createFromParcel(Parcel in) {
        return new VueRelationUI(in);
    }

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

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

@Override
public void writeToParcel(Parcel parcel, int flags) {
    parcel.writeString(getId());
    parcel.writeString(getIdVue());
    parcel.writeString(getIdRelation());
    parcel.writeParcelable(getTypeRelation(), flags);
}
}

ENUM

public enum RelationType implements Parcelable {

INNER,
OUTER;

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

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

public static final Creator<RelationType> CREATOR = new Creator<RelationType>() {
    @Override
    public RelationType createFromParcel(Parcel parcel) {
        return RelationType.values()[parcel.readInt()];
    }

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

任何帮助将非常感激


出现这个问题的原因是Android的内部实现Parcel班级。当您开始新活动时,所有意图额外内容都会被打包,然后再解包。当这种情况发生时,Android框架会分配一个新的Parcelable[], and not a new ProjetUI[]。所以你得到一个ClassCastException当你尝试投射它时。

最好的解决方案可能是更改您的代码以使用ArrayList<ProjetUI>代替ProjetUI[]。然后你可以使用Intent.putParcelableArrayListExtra() and getParcelableArrayListExtra()没有任何问题。

如果由于某种原因你不能这样做,那么你将不得不手动将数组一次转换为一个元素:

Parcelable[] parcelables = getIntent().getParcelableArrayExtra(ARG_PROJECTS);
ProjetUI[] mProjects = new ProjetUI[parcelables.length];

for (int i = 0; i < parcelables.length; ++i) {
    mProjects[i] = (ProjetUI) parcelables[i];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Parcelable 在 Intent 中传递数组 的相关文章

  • 如何将 EditText 传递给另一个活动?

    Intent intent new Intent this Name class intent putExtra key et getText toString startActivity intent Intent intent getI
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • 访问角落里的存储

    我能找到的与文件存储有关的最接近文档的是这个帖子 http nookdeveloper zendesk com entries 20257971 updated what are the size constraints on my app
  • Android-工具栏中的SearchView

    我只想在我的应用程序中添加 searchview 但我不想搜索任何东西 只是我想要用户输入的查询 到目前为止 我尝试了这段代码 但是当我运行我的应用程序时它崩溃了 Update 我尝试了这个 但即使我的应用程序崩溃了 main menu x
  • 监听什么来检测 Android 中的请勿打扰模式更改?

    我希望我的应用程序在手机设置为请勿打扰模式 仅限闹钟 仅限优先级或完全静音 时显示通知 通过聆听 这效果非常好android media RINGER MODE CHANGED在快速设置中检查此模式并在已选择的选项卡中选择模式时 但是 当选
  • AnalyticsService 未在应用程序清单中注册 - 错误

    我正在尝试使用 sdk 中提供的以下文档向 Android 应用程序实施谷歌分析服务 https developers google com analytics devguides collection android v4 https d
  • Android Web Intent 问题

    G day 免责声明 我不是 Android 开发人员 我正在对我所描述的问题进行质量检查 我用来描述这个问题的技术术语可能是错误的 我正在测试一个 Android 应用程序 该应用程序在其清单中描述它可以使用 type 的地址处理 Web
  • 获取向量幂的有效方法

    我编写了一个代码 在数值上使用勒让德多项式直至某个高 n 阶 例如 case 8 p 6435 x 8 12012 x 6 6930 x 4 1260 x 2 35 128 return case 9 如果向量x太长这会变得很慢 我发现说之
  • Android GCM 服务器的 API 密钥

    我有点困惑我应该为 GCM 服务器使用哪个 API 密钥 在文档中它说使用 android api 密钥 这对我不起作用并且总是给出未经授权的 http developer android com google gcm gs html ht
  • Android模拟器分配内存失败8

    当我尝试从 Eclipse 运行 WXGA800 模拟器时 出现如下错误 Failed to allocate memory 8 This application has requested the Runtime to terminate
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • 通过列表视图检查动态生成的复选框时遇到问题

    我知道其他成员已经提出了这个问题 一些成员也给出了解决方案 但问题是我没有找到任何适合我的应用程序的解决方案 我正在创建一个应用程序 其中我有一个屏幕 它将显示动态列表视图 其中包含列表项 复选框和三个文本视图 一个用于候选人姓名 另外两个
  • 如何从 Facebook 邀请好友到 Android 应用程序? - 给出错误

    我正在开发一个 Android 应用程序 我正在努力将 邀请朋友 功能添加到我的应用程序中 它转到我的AppLinkUrl成功但显示错误 我的清单代码如下
  • ACCESS_BACKGROUND_LOCATION 不适用于低于 Q (29) 的 Android 版本

    我的应用程序面向 Android API 28 根据文档 https developer android com preview privacy location target android 10 我应该要求ACCESS BACKGROU
  • 检测 ListView(或 ScrollView)内的滚动位置

    我正在构建一个聊天室应用程序 其中每 X 秒就会轮询一次新事件 每次发生这种情况时 此代码都会使用新数据更新 RoomAdapter ArrayAdapter 的自定义子类 并将其滚动到底部 RoomAdapter adapter Room
  • Android - iphone 风格 tabhost [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0
  • 具有矢量可绘制的 ImageView 的 Resources$NotFoundException

    我遇到了崩溃 Resources NotFoundException用于在活动创建时绘制的矢量 21 日前崩溃 安卓工作室2 1 支持库24 0 0 Gradle插件2 1 0 目标SDK 23 最小SDK 15 buildTools版本
  • Android ADT Eclipse 插件,parseSDKContent 失败

    我刚刚设置了我的第一个 Android 开发环境 其中包括 日食3 5 Mac OS X 10 5 适用于 x86 mac 的 Android SDK ADT Eclipse 插件 0 9 6 我已将 set PATH 设置为我的 SDK

随机推荐

  • 设置 JetBrains YouTrack 以连接到 SVN

    我意识到 TeamCity 一定是 YouTrack 和 SVN 之间的桥梁 但我不需要 Teamcity 的任何功能 我只想通过提交评论发出 Youtrack 命令像这儿 http confluence jetbrains net dis
  • TypeScript 中的“keyof typeof”是什么意思?

    向我解释一下什么keyof typeof在 TypeScript 中的意思是 Example enum ColorsEnum white ffffff black 000000 type Colors keyof typeof Colors
  • bash while循环删除文本文件的最后一行[重复]

    这个问题在这里已经有答案了 当我 cat 这个文件时 我得到 6 行 它是一个 diff 文件 bash 3 00 cat tmp voo 18633a18634 gt sashabSTP 18634a18636 gt sashatSTP
  • 该项目存在于数组中,但它说数组长度为 0?

    我可以将一个项目添加到数组中 并且我可以访问该项目 但是length报告0 Why var arr arr 4294967300 My item console log arr 4294967300 arr length Outputs M
  • 有没有办法使用CSS使用文本作为背景?

    我想使用动态文本作为标签中某些元素的背景 因此 我可以使用图像 动态文本 如何仅使用 CSS 或 JavaScript 来做到这一点 SVG 文本背景图像 body background image url data image svg x
  • 在匹配的正则表达式的一部分上分割字符串(python)

    假设我有一个字符串 ad gt ad gt ad gt gt ad 我想就此分开 gt 不是 gt gt 字符 刚刚拿起正则表达式 想知道是否有一种方法 特殊字符 可以分割匹配表达式的特定部分 而不是分割整个匹配表达式 例如正则表达式可以是
  • 升级到 G++ 4.8 - exception_ptr.h 不支持异常传播

    我正在尝试使用 g 4 8 重新编译一个巨大的遗留应用程序 以便调试glibc detected memory corruption问题 使用 AddressSanitizer 之前我们使用的是 g 4 4 7 但是 编译失败并显示 opt
  • 如何构建 IEnumerable.Contains() 表达式?

    我目前第一次使用 ASP 动态数据 并尝试构建一个过滤器 我们的用户需要根据项目是否是所选父项的子项 我们的项目可以有多个父项 来定位列表中的项目 所讨论的项目是 Segment 每个 Segment 都有一个名为 RouteIds 的属性
  • MySQL 相当于 MS SQL 交叉应用

    如果您习惯了 MS SQL 交叉应用 那么您可能想知道如何在 MySQL 中完成同样的事情 我发现反问句并认为直接的问题可能会帮助任何搜索如何将此功能从 MS SQL 迁移到 MySQL 的人 在此示例中 交叉应用允许您修改字段并在同一查询
  • 正则表达式批量搜索替换

    我想在 Windows 批处理中使用正则表达式模式对一组文件进行搜索 替换 它会是这样的 if the regex matches a line matches then replace it with a new line 我还需要在正则
  • 如何将 SVG 中的路径数据变形为另一个路径数据?

    我试图弄清楚为什么它不会将此路径数据变形为另一个路径数据 我需要使其看起来像真正的动画 这是我的 SMIL 代码
  • 导入 csv 时,Pandas 无法识别一列浮点数

    我正在尝试将国际货币基金组织的统计数据读入 pandas 数据框 import pandas as pd df pd read table http www imf org external pubs ft weo 2013 02 weod
  • php mail() 函数导致 404 文件未找到页面

    我有一个带有 html 表单的简单 php 页面 它的设置是让您填写表格并自动向我的电子邮件发送电子邮件 我没有收到任何电子邮件 并且页面重定向到 找不到文件 404 错误 而不是发生这种情况 这是 PHP
  • Knockout js:如何一次获取所有属性的通知

    假设我有一个包含 100 个 props 的 ViewModel 目前 我需要一个处理程序 如果任何道具发生变化 就会调用该处理程序 当然 我可以为每个属性编写 100 subscribe 但似乎有更好的方法 就像在 C 中一样 您可以绑定
  • 在 Windows 上为 Python 2.7 构建 lxml

    我正在尝试在 Windows 64 位计算机上为 Python 2 7 构建 lxml 我找不到 Python 2 7 版本的 lxml Egg 所以我从源头编译它 我正在按照该网站上的说明进行操作 http lxml de build h
  • 使用 Selenium 通过 MacOS 窗口上传图像

    Set up 我正在使用 Python 3 x 和 Selenium 在网上商店的后端工作 我需要从我的电脑上传产品图片到平台后端 Problem 使用 Selenium 可以单击图像上传按钮 但是单击会弹出 MacOS 文件选择器 Sel
  • Python,无法将 input() 转换为 int()

    我正在尝试使用以下代码将 input 数据转换为 int prompt text Enter a number try user num int input prompt text except ValueError print Error
  • 输出显示在 Jupyter Notebook 中,但未显示在 PyCharm 中

    我看过类似的帖子 但没有看到任何真正解决 Jupyter Notebook 和 PyCharm 之间输出差异的回复 一个例子是这样的 from datetime import datetime now datetime now now Ou
  • 为什么 text-decoration: none 在 p 中不起作用?

    我有以下 HTML 和 CSS 片段 我想要 不要强调 但确实如此 我究竟做错了什么 p color red text decoration underline font size 1 2em span none text decorati
  • 使用 Parcelable 在 Intent 中传递数组

    我想在活动之间发送一系列对象 我想使用 Parcelable 接口并以意图发送数据 但是我不断收到错误 我已经被困了2天了 以下是有关我的问题的一些详细信息 Class A private ProjetUI mProjects privat