Android中从Activity及RecyclerView适配器传值至目标Activity返回Null问题
解决两个Intent传值返回Null的问题
问题1:第一个Activity通过Intent.getExtras()传递数据返回Null
这种情况基本都是传值链路里某个环节出了疏漏,给你列几个最常见的排查方向和解决办法:
- 核对键名的一致性:你在第一个Activity用
intent.putExtra("USER_NAME", username)时的键名,和第二个ActivitygetIntent().getExtras().getString("USER_NAME")的键名必须完全一致——大小写、拼写差一个字符都会直接返回null。 - 确认Intent已正确启动目标页:有没有调用
startActivity(intent)或者startActivityForResult(intent, requestCode)?如果没执行启动操作,目标Activity自然拿不到任何数据。 - 传递自定义对象时要序列化:如果传的是自己定义的类对象,必须让这个类实现
Parcelable或Serializable接口,不然Intent无法完成对象的序列化传递,getExtras()就会返回null。举个Parcelable的简单示例:public class User implements Parcelable { // 实现Parcelable要求的describeContents()和writeToParcel()方法 // 以及对应的Creator内部类 } - 优先用Intent的putExtra方法:尽量不要手动创建Bundle再设置给Intent,直接用
intent.putExtra()系列方法添加数据,手动操作Bundle偶尔会出现意外的空值问题。
问题2:BlogRecyclerAdapter传递用户名到目标Activity返回Null
结合你给出的Adapter代码开头,大概率是这几个地方出了问题,你可以逐个排查:
- 先确认要传递的用户名本身不为空:在Adapter的点击事件里,先打印
blog_list.get(position).getUsername()的值,如果这个值本身就是null,那传过去肯定也是null——这时候要检查FirebaseFirestore获取BlogPost数据时,有没有把Firestore里的用户名字段正确映射到BlogPost对象的对应变量上(比如Firestore里是"username",你BlogPost里的变量是userName,就会映射失败)。 - 点击事件中获取正确的列表位置:在ViewHolder的点击监听里,要用
getAdapterPosition()获取当前项的真实数据位置,别用getLayoutPosition()(这个是布局渲染位置,可能和数据列表位置不匹配),示例代码:@Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.itemView.setOnClickListener(v -> { int correctPosition = holder.getAdapterPosition(); if (correctPosition != RecyclerView.NO_POSITION) { BlogPost post = blog_list.get(correctPosition); String username = post.getUsername(); // 先打印username确认不为null再继续传递逻辑 } }); } - 用正确的上下文创建Intent:在Adapter里创建Intent时,要用构造方法传入的
context(应该是Activity上下文),别用context.getApplicationContext()——虽然多数时候没问题,但偶尔会导致Intent传递异常。正确写法:Intent intent = new Intent(context, TargetActivity.class); intent.putExtra("USERNAME", username); context.startActivity(intent); - 核对目标Activity的取值键名:和问题1一样,目标Activity里的取值键名必须和Adapter里
putExtra的键完全一致,比如Adapter用的是"USERNAME",目标页就不能写成"user_name"。
最后给你个小建议:把传递数据的键名定义成全局常量,比如在某个工具类里写public static final String KEY_USERNAME = "USER_NAME";,这样两边都引用这个常量,就能彻底避免拼写错误的问题。
内容的提问来源于stack exchange,提问作者Hrithik Rawal
相关产品推荐
相关产品推荐

