子 Activity 透過 setResult + finish 傳回資料,主 Activity onActivityResult 取得 EditText 為空。
Intent intent = new Intent(); intent.setClass(...) 未指定 startActivityForResult,導致非回傳模式。startActivityForResult(intent, REQUEST_CODE) 需要請求碼識別來源。onActivityResult 需判斷 resultCode == RESULT_OK。
// 主 Activity
Intent intent = new Intent(MainActivity.this, SubActivity.class);
intent.putExtra("key", "value");
startActivityForResult(intent, REQUEST_CODE_SUB); // 關鍵:使用 startActivityForResult
// 子 Activity
Intent result = new Intent();
result.putExtra("return_key", "return_value");
setResult(RESULT_OK, result); // 設定結果碼與資料
finish();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_SUB && resultCode == RESULT_OK && data != null) {
String value = data.getStringExtra("return_key");
editText.setText(value);
}
}
// 主 Activity (在 onCreate 中註冊)
ActivityResultLauncher subLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK && result.getData() != null) {
String value = result.getData().getStringExtra("return_key");
editText.setText(value);
}
}
);
// 啟動
subLauncher.launch(new Intent(this, SubActivity.class).putExtra("key", "value"));
優勢:型別安全、生命週期感知、無請求碼衝突、程式碼集中。
startActivityForResult / ActivityResultLauncher。setResult(RESULT_OK, intent) 後 finish()。requestCode、resultCode、data != null。Intent.putExtra 鍵名拼寫完全一致。掌握「請求碼 + 結果碼 + 資料包」三要素,Activity 間資料流轉才能可靠運作。