获取 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<Animal>)
?
是的,animals = arguments.getSerializable(ARG_ANIMALS) as ArrayList
确保动物类已经实现了可序列化
错误出现在哪一行?
我认为 args.putSerializable(ARG_ANIMALS, animals as Serializable) 应该可以工作!
【参考方案1】:
正如评论中提到的,投射它:
注意:如果是 ArrayList,则不需要强制转换为 Serializable(这意味着 ArrayList
- List 和 MutableList 受到不同的影响)。 List
和 MutableList
必须强制转换为 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<Animal>
与ArrayList<*>
不匹配而导致错误
您可能希望考虑使用 List 而不是 ArrayList,以概括您接受哪些类型(包括 MutableList 实例)。
这只有在 Animal 实现 Serializable 时才有效。否则,当您从捆绑包中放置/获取列表时,它会崩溃。只有当列表中的类也是可序列化的时,列表才可序列化。
【讨论】:
您能否解释一下为什么在将animals
传递给putSerializable
时必须将其转换为Serializable
?
@SpaceBison tbh,当我进行测试时,我使用了 List 和 MutableList。 ArrayList 显然没有必要,但 List 和 MutableList 必须强制转换为 Serializable。
我明白了。那是因为ArrayList
实现了Serializable
,但List
和MutableList
没有扩展它,所以它们需要显式转换。 :)
它们仍然可以被序列化,假设它拥有的类是可序列化的。但这似乎是正确的:)【参考方案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 上的另一个类?
java [Intent] Intent片段以启动Activity,Service或发送广播。 #android_snippet #android