使用Intent从RecyclerAdapter向Activity传参时App崩溃,需传递restaurant id
崩溃排查与解决步骤
第一步:优先获取崩溃堆栈信息
先查看Logcat输出的完整崩溃堆栈,确认崩溃是发生在点击跳转前的Adapter逻辑里,还是跳转后RestaurantMenuActivity的接收参数逻辑里,快速缩小问题范围。
第二步:排查跳转前的常见崩溃点
- 检查
holder.txtRestaurantName.tag空指针问题:这是该场景最高发的崩溃原因,你直接调用toString(),如果tag未提前赋值、赋值为null,就会触发空指针异常。
修复代码示例:holder.llContent.setOnClickListener { // 先对tag判空,为空就直接截断点击逻辑避免崩溃 val restaurantId = holder.txtRestaurantName.tag?.toString() ?: return@setOnClickListener val restaurantName = holder.txtRestaurantName.text?.toString() ?: "" println(restaurantId) val intent = Intent(context, RestaurantMenuActivity::class.java).apply { putExtra("restaurantId", restaurantId) putExtra("restaurantName", restaurantName) } context.startActivity(intent) } - 检查启动Activity的Context类型:如果你的Adapter传入的Context是Application上下文,直接启动Activity需要添加
FLAG_ACTIVITY_NEW_TASK旗标,否则会抛出异常。推荐直接用RecyclerView宿主Activity的Context来启动页面,不需要额外加旗标。 - 检查
RestaurantMenuActivity是否已在AndroidManifest.xml中注册,未注册的Activity启动时会直接抛出ActivityNotFoundException。
第三步:排查跳转后接收参数的常见崩溃点
- 确认
RestaurantMenuActivity中取参数的key和传入的key完全一致,大小写也需要匹配,比如不要把restaurantId误写为RestaurantId。 - 如果你在接收端需要把
restaurantId转为Int/Long类型使用,一定要加异常捕获,避免id内容不是纯数字导致类型转换崩溃:// 接收端示例代码 val restaurantIdStr = intent.getStringExtra("restaurantId") ?: "" val restaurantId = try { restaurantIdStr.toLong() } catch (e: NumberFormatException) { // 异常处理逻辑,比如返回上一页、给默认id -1L }
优化建议
- 不要用View的tag存储业务参数,推荐直接从Adapter对应的数据源实体类里取对应position的restaurantId,比从View的tag取值更稳定,也避免tag被其他逻辑覆盖导致数据错误。
- 项目如果支持Parcelable序列化,可以直接把整个餐厅实体类序列化后通过Intent传递,减少多参数传递时key写错的概率。
内容的提问来源于stack exchange,提问作者prateek jain
相关产品推荐
相关产品推荐

