Android应用因getSerializableExtra崩溃,求助解决ListView跳转问题
Android ListView跳转详情页崩溃问题解决(Serializable相关)
问题根源分析
- 数据传递不匹配:MainActivity中通过Intent传递的是单个字符串(
landmarkName),但DetailsActivity试图获取key为landmark的Serializable对象,直接导致类型转换异常或空指针崩溃。 - 废弃API使用:
getSerializableExtra(String)已被标记为废弃,需要适配Android 13+的新API。
修复步骤
1. 修正MainActivity的Intent传递逻辑
传递完整的LandMark对象,统一使用keylandmark:
binding.listView.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> val intent = Intent(this, DetailsActivity::class.java) // 传递完整的LandMark对象 intent.putExtra("landmark", landmarkList[position]) startActivity(intent) }
2. 替换DetailsActivity中的废弃API并加入安全处理
兼容新旧版本Android系统,同时避免类型转换崩溃:
class DetailsActivity : AppCompatActivity() { private lateinit var binding: ActivityDetailsBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityDetailsBinding.inflate(layoutInflater) setContentView(binding.root) // 安全获取Serializable对象,兼容新旧版本 val selectedLandMark = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent.getSerializableExtra("landmark", LandMark::class.java) } else { @Suppress("DEPRECATION") intent.getSerializableExtra("landmark") as? LandMark } // 非空判断后更新UI,避免空指针 selectedLandMark?.let { binding.LandMarkName.text = it.name binding.LandMarkCountry.text = it.country binding.imageView.setImageResource(it.image) } ?: run { // 数据为空时返回上一页 finish() } } }
3. 保持LandMark类的Serializable实现不变
当前LandMark类的代码符合要求,无需修改:
package com.example.landmarkbookkotlin import java.io.Serializable class LandMark(val name: String, val country: String, val image: Int) : Serializable
关键说明
- 确保Intent传递的key和接收端的key完全一致,避免因key不匹配导致数据为空。
- 使用带
Class参数的getSerializableExtra新API,消除废弃警告的同时提升类型安全性。 - 加入非空判断,即使数据传递异常也能优雅处理,避免崩溃。
内容的提问来源于stack exchange,提问作者Maelstrom
相关产品推荐
相关产品推荐

