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

Android:如何将Activity3的数据回显至首个主Activity?

解决Activity3回传数据到Activity1的报错问题

问题根源

你在onCreate里直接调用bundle.getString()时首次启动报错,是因为第一次启动Activity1时,它是从应用 launcher 打开的,此时getIntent().getExtras()会返回null,直接调用bundle.getString()就会触发NullPointerException。

快速修复当前代码

最简单的解决方式是先判断bundle是否为null,再执行赋值逻辑。修改Activity1的代码如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    EditText edittext = findViewById(R.id.edittext);
    Bundle bundle = getIntent().getExtras();
    
    // 先检查bundle是否存在,避免空指针
    if (bundle != null) {
        String s = bundle.getString("datavalue");
        edittext.setText(s);
    }
}

这样首次启动时,bundle为null,不会执行setText操作,就不会报错了。

更规范的回传数据方案

不过上面的方式会重新创建一个Activity1的实例(默认启动模式下),如果你的需求是回到原来的Activity1实例并更新数据,更推荐以下两种方案:

方案1:使用Activity Result API(推荐,替代已废弃的startActivityForResult)

这种方式是让Activity1主动等待后续页面返回的数据,流程更清晰:

  1. 在Activity1中注册ActivityResultLauncher:
private ActivityResultLauncher<Intent> activityResultLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 注册结果监听器
    activityResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == RESULT_OK) {
                Intent data = result.getData();
                if (data != null) {
                    String returnedData = data.getStringExtra("datavalue");
                    EditText edittext = findViewById(R.id.edittext);
                    edittext.setText(returnedData);
                }
            }
        }
    );
    
    // 启动Activity2时使用这个launcher(替换你原来的启动逻辑)
    findViewById(R.id.your_start_activity2_button).setOnClickListener(v -> {
        Intent intent = new Intent(Activity1.this, Activity2.class);
        // 传递EditText的值到Activity2
        intent.putExtra("editTextValue", edittext.getText().toString());
        activityResultLauncher.launch(intent);
    });
}
  1. 在Activity3中返回数据给Activity1:
// 在Activity3中,当需要返回数据时(比如点击返回按钮)
Intent resultIntent = new Intent();
resultIntent.putExtra("datavalue", "SomeData");
setResult(RESULT_OK, resultIntent);
finish(); // 关闭Activity3,回到Activity2
  1. 在Activity2中把结果传递回Activity1:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 接收Activity3返回的数据,再传递给Activity1
    if (resultCode == RESULT_OK) {
        setResult(RESULT_OK, data);
        finish(); // 关闭Activity2,回到Activity1
    }
}

// 注意:Activity2启动Activity3时也要用startActivityForResult
// 比如在Activity2的启动逻辑中:
Intent intent = new Intent(Activity2.this, Activity3.class);
// 传递从Activity1获取到的EditText值
intent.putExtra("receivedValue", getIntent().getStringExtra("editTextValue"));
startActivityForResult(intent, 100); // 100是自定义请求码

方案2:使用启动模式+onNewIntent

如果你希望直接从Activity3回到原来的Activity1实例,可以通过设置Intent的flags来复用已有的Activity1:

  1. 修改Activity3的启动代码:
Intent i = new Intent(Activity3.this, Activity1.class);
String data = "SomeData";
i.putExtra("datavalue", data);
// 清除栈中Activity1之上的所有Activity,并复用已有的Activity1实例
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
finish(); // 关闭Activity3
  1. 在Activity1中重写onNewIntent方法处理返回的数据:
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent); // 更新当前的Intent为新传入的Intent
    
    // 处理从Activity3返回的数据
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        String s = bundle.getString("datavalue");
        EditText edittext = findViewById(R.id.edittext);
        edittext.setText(s);
    }
}

// 同时在onCreate中保留空判断逻辑,处理首次启动
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    EditText edittext = findViewById(R.id.edittext);
    Bundle bundle = getIntent().getExtras();
    
    if (bundle != null) {
        String s = bundle.getString("datavalue");
        edittext.setText(s);
    }
}

这样既解决了首次启动的报错问题,又能正确接收从Activity3返回的数据。

内容的提问来源于stack exchange,提问作者PankajR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:27:49