You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Intent在两个Activity间互传数据,返回首个Activity时数值为空如何解决?

问题根源

  1. 首次启动Main(Activity1)时,系统传入的启动Intent默认不携带date和name参数,直接调用getIntent().getStringExtra()拿到的就是null值。
  2. 你在第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:21:00