使用Intent在两个Activity间互传数据,返回首个Activity时数值为空如何解决?
问题根源
- 首次启动
Main(Activity1)时,系统传入的启动Intent默认不携带date和name参数,直接调用getIntent().getStringExtra()拿到的就是null值。 - 你在第二个Activity选完日期后,直接调用
startActivity新建了一个Main实例,不是回到原有Main实例,多次跳转还会导致返回栈堆叠大量无效Activity实例,占用内存。
修复方案
改用Android官方推荐的带返回结果的跳转逻辑,不要重复创建首页实例:
1. 修改Activity1(Main)代码
// 先定义请求码常量,用于区分返回结果的来源 private static final int REQUEST_SELECT_DATE = 1; // 用成员变量存储全局值,避免被临时Intent参数覆盖 private String date; private String name = "默认用户名"; // 可根据实际业务修改初始值,避免null @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView1 = findViewById(R.id.text1); textView2 = findViewById(R.id.text2); b1 = findViewById(R.id.button1); // 仅当有外部传入参数时才覆盖默认值,增加非空判断避免空指针 if (getIntent() != null) { date = getIntent().getStringExtra("date"); String tempName = getIntent().getStringExtra("name"); if (tempName != null) { name = tempName; } } // 设置文本前做兼容,避免空值直接展示null textView1.setText(date != null ? date : "未选择日期"); textView2.setText(name); b1.setOnClickListener(v -> { Intent intent = new Intent(Main.this, DateActivity.class); intent.putExtra("name1", name); // 改用带请求码的跳转,等待第二个页面返回结果 startActivityForResult(intent, REQUEST_SELECT_DATE); }); } // 重写方法接收第二个页面的返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_SELECT_DATE && resultCode == RESULT_OK && data != null) { // 更新成员变量的值 date = data.getStringExtra("date"); String returnedName = data.getStringExtra("name"); if (returnedName != null) { name = returnedName; } // 刷新UI textView1.setText(date); textView2.setText(name); } }
2. 修改Activity2(日期选择页)代码
注意类名不要用小写date,Java规范要求类名首字母大写,避免和变量名冲突
private String name1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_date); calendarView = findViewById(R.id.calendarView); if (getIntent() != null) { name1 = getIntent().getStringExtra("name1"); } calendarView.setOnDateChangeListener((view, year, month, dayOfMonth) -> { // 注意CalendarView返回的month范围是0~11,0代表1月,需要+1才是实际月份 String date = dayOfMonth + "-" + (month + 1) + "-" + year; Intent resultIntent = new Intent(); resultIntent.putExtra("date", date); resultIntent.putExtra("name", name1); // 设置返回结果,直接销毁当前页面回到上一级Activity setResult(RESULT_OK, resultIntent); finish(); }); }
额外注意事项
- 如果使用AndroidX开发,更推荐用Activity Result API替代已经废弃的
startActivityForResult,逻辑更简洁也更容易维护 - 所有从Intent取值的位置都要做非空判断,避免异常崩溃
内容的提问来源于stack exchange,提问作者Burning yolooo
相关产品推荐
相关产品推荐

