Kotlin中通过Intent传递自定义对象数组并转为ArrayList
解决Android中传递自定义对象数组并转为ArrayList的问题
我来帮你搞定这个Android页面间传递自定义对象数组的问题,你的代码目前有两个核心问题需要修正:一是自定义的Attachment类没有实现序列化接口(Android的Intent无法直接传递未序列化的对象);二是ActivityB里还没完成接收和转换的逻辑。咱们一步步来解决:
1. 让自定义数据类实现序列化接口
Android中传递对象必须让对象实现Parcelable或Serializable接口,推荐用Parcelable(Android专属,性能比Serializable高很多),两种方式的实现如下:
方式一:Parcelable(推荐)
使用Kotlin的@Parcelize注解可以自动生成Parcelable的实现代码,非常省心:
import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize data class Attachment(val Name: String, val Content: String) : Parcelable
注意:要使用这个注解,需要在模块级别的build.gradle中添加kotlin-parcelize插件:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-parcelize' // 新增这一行 }
方式二:Serializable(简单通用)
如果追求简单,也可以实现Serializable接口,代码更短,但性能不如Parcelable:
import java.io.Serializable data class Attachment(val Name: String, val Content: String) : Serializable
2. 修改ActivityA的传递逻辑
首先要确保ActivityA继承AppCompatActivity(否则无法使用Intent相关方法),然后补充启动Activity的代码:
class ActivityA : AppCompatActivity() { // 示例数据,你可以换成自己的数组 private var attachments: Array<Attachment> = arrayOf( Attachment("文件1", "内容1"), Attachment("文件2", "内容2") ) fun callB() { val intent = Intent(this, ActivityB::class.java).apply { // 如果用Parcelable,用putParcelableArrayExtra传递数组 putParcelableArrayExtra("Attachments", attachments) // 如果用Serializable,换成下面这行: // putSerializableExtra("Attachments", attachments) } startActivity(intent) // 别忘了启动ActivityB } }
3. 在ActivityB中接收并转为ArrayList
同样要让ActivityB继承AppCompatActivity,然后在onCreate方法中接收数据并转换:
class ActivityB : AppCompatActivity() { private lateinit var attachmentsList: ArrayList<Attachment> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_b) // 接收数据,根据你用的序列化方式选择对应方法 val attachmentsArray = intent.getParcelableArrayExtra<Attachment>("Attachments") // 如果用Serializable,换成下面这行: // val attachmentsArray = intent.getSerializableExtra("Attachments") as? Array<Attachment> attachmentsArray?.let { // 将数组转换为可修改的ArrayList attachmentsList = ArrayList(it.asList()) // 这里可以添加你的业务逻辑,比如遍历数据 for (attachment in attachmentsList) { println("文件名:${attachment.Name},内容:${attachment.Content}") } } ?: run { // 处理未接收到数据的异常情况 println("未接收到附件数据") } } }
补充说明
it.asList()返回的是一个固定大小的列表,用ArrayList()包装后就变成了可添加/删除元素的ArrayList;- 传递数据时的key(这里是"Attachments")要和接收时的key完全一致,否则会接收不到数据;
- 如果你的数组可能为空,一定要做非空判断,避免空指针异常。
内容的提问来源于stack exchange,提问作者Sankar
相关产品推荐
相关产品推荐

