Android跳转EventDetail页读取eventRole参数时闪退回上页如何解决?
问题根因
闪退的核心原因是Intent传递和接收的数据类型不匹配:
- 你从Firestore中读取的
eventRole字段对应数组类型,在Java实体类中getEventRoles()默认返回的是List<String>类型,而非原生String[]数组。你直接调用intent.putExtra("eventRole", datalist.get(position).getEventRoles())存入时,系统会将其识别为Serializable类型的List集合。 - 你在
EventDetail中调用getStringArrayExtra("eventRole")取值,只能得到null,将null传入ArrayAdapter构造方法会触发空指针异常,导致应用直接闪退回退。
解决方案
两种方案二选一即可:
方案1:传递时转换为String数组
修改Adapter中Intent传值的逻辑,存入前先把List转为String数组:
holder.detailBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(holder.detailBtn.getContext(), EventDetail.class); intent.putExtra("eventName", datalist.get(position).getEventName()); intent.putExtra("eventDate", datalist.get(position).getEventDate()); intent.putExtra("eventVenue", datalist.get(position).getEventVenue()); intent.putExtra("eventDesc", datalist.get(position).getEventDesc()); // 新增转换逻辑 List<String> roleList = datalist.get(position).getEventRoles(); String[] roleArray = roleList.toArray(new String[0]); intent.putExtra("eventRole", roleArray); intent.putExtra("eventCreator", datalist.get(position).getEventCreator()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); holder.detailBtn.getContext().startActivity(intent); } });
EventDetail中的原有接收逻辑无需修改。
方案2:接收时按List类型取值
ArrayAdapter本身支持直接传入List作为数据源,无需修改传值逻辑,直接修改接收代码即可:
List<String> roles = (List<String>) getIntent().getSerializableExtra("eventRole"); ArrayAdapter adapter = new ArrayAdapter(this, R.layout.option_item, roles);
调试建议
如果后续遇到类似无明确报错的闪退问题,可以将可疑代码块用try-catch包裹,打印异常栈快速定位问题:
try { // 可疑代码 } catch (Exception e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者PI PI NAN
相关产品推荐
相关产品推荐

