java - Intent 内 android.util.ArrayMap 中的 ClassNotFoundException

标签 java android android-intent

我正在开发一个 Android 应用程序,在其中一个部分中,我使用 Intent 从 DatePicker 对话框 fragment 将数据传递回使用 getTargetFragment().onActivityResult(int targetRequestCode, int resultCode, Intent Intent) 创建它的 fragment 。我将从日历 fragment 中提取的三个整数(日期、月份和年份)添加到正在传递的 Intent 中。然后我在创建它的 fragment 的 onActivityResult() 方法中读取了这个 Intent 。一切都按其应有的方式运作,一切都很好,而且世界是一个完美的居住地。

当我尝试调试我犯的一个愚蠢错误时,我注意到一些有趣的事情。当我扩展 Intent 的内容时,我发现我的数据如预期一样位于一个 bundle 中。但我看到 Intent 中还有另一个对象,名为 android.util.ArrayMap,大小为 3。

ArrayMap exception

这个大小似乎与我放入 Intent 中的数据数量相对应(我通过添加额外的虚拟参数对其进行了测试)。当我展开 ArrayMap 的内容时,我看到它抛出 ClassNotFoundException。为什么会这样做呢。键类型是 String ,值类型是 Integer (我输入了一个 int ,但我认为这并不重要,因为我在 String 中添加了键和值,但它仍然抛出异常)。我扩展了 ArrayMap 详细信息,但似乎没有意义。

Details of the ArrayMap

我的问题是:

  • 为什么会发生这个 ClassNotFoundException?
  • 首先需要什么 ArrayMap?

最佳答案

您的 putExtra 值保存在 Bundle 的内部数据结构中,该结构恰好是 ArrayMap

这里是its definition, declared in Bundle.java source

    // Invariant - exactly one of mMap / mParcelledData will be null
    // (except inside a call to unparcel)

    /* package */ ArrayMap<String, Object> mMap = null;

我猜它会将您的 int 转换为更通用的 Object 类。

ClassNotFoundException 可能是 IDE/调试窗口问题,因为这里没有针对此数据结构的任何其他自定义类。另外,你是expected to use package-name prefix in your name, as mentioned here

The name must include a package prefix, for example the app com.android.contacts would use names like "com.android.contacts.ShowAll".

关于java - Intent 内 android.util.ArrayMap 中的 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26348835/

相关文章:

java - 当数据/模型更改时通知 View /Activity

java - Android自定义属性返回null

java - 将servlet重定向到jsp

android - 从 WallpaperService 启动 Intent 或向 WallpaperService 启动 Intent

android - 将 DexGuard 集成到 Android Studio

java - sonarqube版本3.7.3支持java 1.7吗?

android - 再次开始 Retrofit 调用,从 RXJava 中的 onError 回调再次订阅 Observable

android - 调用 Intent 过滤器

java - HTTP ://a href link not working in Android

android - 我无法从我的 Intent 中获取 Extras?