获取 Intent 片段上的 Serializable ArrayList

Posted

技术标签:

【中文标题】获取 Intent 片段上的 Serializable ArrayList【英文标题】:Get Serializable ArrayList on Intent fragment 【发布时间】:2018-08-12 04:28:37 【问题描述】:

在我的片段上,我想获得ArrayList<Animal>。我创建了一个 newInstance 函数。

  companion object 
    private val ARG_TITLE = "ARG_TITLE"
    private val ARG_ANIMALS = "ARG_ANIMALS"

    fun newInstance(title: String,animals: ArrayList<Animal>): ExampleFragment
        val fragment = ExampleFragment()
        val args = Bundle()
        args.putString(ARG_TITLE, title)
        args.putSerializable(ARG_ANIMALS, animals)
        fragment.arguments = args
        return fragment
    

在我的onCreate() 我有这个。

 private var title: String = ""
lateinit private var animals:ArrayList<Animal>

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    if (arguments != null) 
        title = arguments.getString(ARG_TITLE)
        animals = arguments.getSerializable(ARG_ANIMALS)
    

但是

必需:ArrayList 找到序列化!

也不能转换为 ArrayList。

【问题讨论】:

您是否尝试将其投射到(ArrayList&lt;Animal&gt;) 是的,animals = arguments.getSerializable(ARG_ANIMALS) as ArrayList 确保动物类已经实现了可序列化 错误出现在哪一行? 我认为 args.putSerializable(ARG_ANIMALS, animals as Serializable) 应该可以工作! 【参考方案1】:

正如评论中提到的,投射它:

注意:如果是 ArrayList,则不需要强制转换为 Serializable(这意味着 ArrayList - List 和 MutableList 受到不同的影响)。 ListMutableList 必须强制转换为 Serializable(否则会显示“不兼容的类型”错误)

args.putSerializable(ARG_ANIMALS, animals as Serializable) //This is to cast it to the appropriate form in order for it to be serialized properly

并将其镜像到输出:

无论如何都需要在此处投射。否则你只会得到一个 Serializable 而不是你已经序列化的类。

animals = arguments.getSerializable(ARG_ANIMALS) as ArrayList<Animal>

必须在菱形中指定类型,否则会因animals: ArrayList&lt;Animal&gt;ArrayList&lt;*&gt; 不匹配而导致错误

您可能希望考虑使用 List 而不是 ArrayList,以概括您接受哪些类型(包括 MutableList 实例)。

这只有在 Animal 实现 Serializable 时才有效。否则,当您从捆绑包中放置/获取列表时,它会崩溃。只有当列表中的类也是可序列化的时,列表才可序列化。

【讨论】:

您能否解释一下为什么在将animals 传递给putSerializable 时必须将其转换为Serializable @SpaceBison tbh,当我进行测试时,我使用了 List 和 MutableList。 ArrayList 显然没有必要,但 List 和 MutableList 必须强制转换为 Serializable。 我明白了。那是因为ArrayList 实现了Serializable,但ListMutableList 没有扩展它,所以它们需要显式转换。 :) 它们仍然可以被序列化,假设它拥有的类是可序列化的。但这似乎是正确的:)【参考方案2】:

在意图片段上获取 ArrayList 是通过这行代码完成的。 并且此代码适用于 Object 类型的 Serializable 和 non-Serializable ArrayList。

//first add this dependency in app build.gradle file
compile 'com.google.code.gson:gson:2.8.0'


//to send the arraylist contains elements of object type.
ArrayList<Object> mOrderList=new ArrayList();
//suppose this list now contains some data like number of objects.
Fragment fragment new YourFragment();
Bundle bundle=new Bundle();
Gson gson = new Gson();
String jsonDetails = gson.toJson(mOrderList);
bundle.putString(IntentKeyConstants.TAG_ORDER_LIST, jsonDetails);
fragment.setArguments(bundle);
FragmentTransaction fragmentTransaction=getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment, CURRENT_TAG);
fragmentTransaction.addToBackStack(CURRENT_TAG);
fragmentTransaction.commit();


//to get the arraylist contains the element of object type in fragment
ArrayList<Object> mOrderList=new ArrayList();
Gson gson=new Gson();
String jsonDetails;  
jsonDetails=getArguments().getString(IntentKeyConstants.TAG_ORDER_LIST);
Type type=new TypeToken<ArrayList<SuggestionResponseBean>>().getType();
mOrderList=gson.fromJson(jsonDetails,type);

我希望这个解决方案对您有所帮助。 谢谢

【讨论】:

【参考方案3】:

尝试将您在片段中获得的参数转换为您想要的数组列表: 这很可能对你有用:

例如。

"ARRAYLIST_OBJECT"= arguments.getSerializable("ARGUMENT_NAME") as ArrayList<"ARRAYLIST_NAME">

谢谢。

【讨论】:

不能使用字符串作为类型参数,也不能这样强制转换,也不能像这样使用'as'。 " " 这是一个例子,表明你必须在这里写对象。请说清楚。其文学指定ARRAYLIST_OBJECT请仔细阅读答案。 “其文学指定的ARRAYLIST_OBJECT”绝对没有任何意义,您没有理由将其写为字符串-但即使他纠正了字符串,该代码也是无意义的-即使作为伪代码也毫无意义.这个答案唯一能做到的就是浪费那些会因此而迷失的Java新手的时间。 如果您有其他想法,请发表其他想法,我们会从中学习:) 没有自负。【参考方案4】:

你必须让你的 Animal 类实现 Serializable 并使用下面的代码来设置 bundle 中的数据

args.putSerializable(ARG_ANIMALS, animals)

为了获取另一个片段中的数据,如下所示

animals = arguments.getSerializable(ARG_ANIMALS)

【讨论】:

以上是关于获取 Intent 片段上的 Serializable ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

如何获取接收到 Intent 的变量,使其成为静态变量,并将其发送到 Android 上的另一个类?

片段创建的 Intent 不会触发 onNewIntent

java [Intent] Intent片段以启动Activity,Service或发送广播。 #android_snippet #android

无法找到包含 Intent 在片段中时的配置根

无法通过使用 Volley 库中的 Intent 从片段中移动下一个 Activity

如何将数据从 Intent 传递到 Fragment