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

如何将条码扫描结果返回至前一个Activity的文本输入框?

嘿,这个需求在Android开发里太常见了,我给你梳理清楚怎么一步步实现,分两种主流方式来讲解,你可以根据自己的项目版本选择:

核心思路

本质就是利用Activity之间的结果返回机制:前一个Activity启动扫描页面时,明确要接收返回结果;扫描页面拿到条码后,把结果打包进Intent返回,再关闭自己,最后前一个Activity拿到结果填充到输入框里。

方式一:推荐用ActivityResultContract(适配AndroidX及高版本)

因为startActivityForResult已经在API 30被标记为废弃,官方推荐用ActivityResultContract来处理页面间的结果传递,步骤如下:

1. 在前一个Activity(比如你的输入页)注册结果监听器

假设你的输入页叫InputActivity,里面有个EditText叫barcodeEt,还有触发扫描的按钮scanBtn:

// Kotlin 代码示例
class InputActivity : AppCompatActivity() {
    private lateinit var barcodeEt: EditText
    private lateinit var scanBtn: Button

    // 注册扫描结果的监听器
    private val scanLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        // 判断结果是否成功返回
        if (result.resultCode == Activity.RESULT_OK) {
            val scanResult = result.data?.getStringExtra("SCAN_RESULT")
            // 把结果填充到输入框
            scanResult?.let { barcodeEt.setText(it) }
        } else {
            // 可以处理用户取消扫描的情况,比如提示一下
            Toast.makeText(this, "取消扫描", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_input)
        barcodeEt = findViewById(R.id.et_barcode)
        scanBtn = findViewById(R.id.btn_scan)

        // 点击按钮启动扫描页面
        scanBtn.setOnClickListener {
            val intent = Intent(this, BarcodeScanActivity::class.java)
            scanLauncher.launch(intent)
        }
    }
}

2. 在扫描Activity里返回结果

当你的扫描逻辑成功获取到条码后,把结果通过Intent传递回去,然后关闭当前页面:

// Kotlin 代码示例
// 假设你在扫描成功的回调里拿到了条码结果barcodeStr
val resultIntent = Intent()
resultIntent.putExtra("SCAN_RESULT", barcodeStr)
// 设置结果状态为成功
setResult(Activity.RESULT_OK, resultIntent)
// 关闭扫描页面
finish()

方式二:用旧的startActivityForResult(兼容低版本)

如果你的项目还在使用旧的API,或者习惯用这种方式,也可以这么做:

1. 在前一个Activity启动扫描页面并处理返回结果

// Java 代码示例
public class InputActivity extends AppCompatActivity {
    private EditText barcodeEt;
    private Button scanBtn;
    // 定义请求码,用来区分不同的页面返回
    private static final int SCAN_REQUEST_CODE = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input);
        barcodeEt = findViewById(R.id.et_barcode);
        scanBtn = findViewById(R.id.btn_scan);

        scanBtn.setOnClickListener(v -> {
            Intent intent = new Intent(InputActivity.this, BarcodeScanActivity.class);
            startActivityForResult(intent, SCAN_REQUEST_CODE);
        });
    }

    // 重写onActivityResult接收返回结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == SCAN_REQUEST_CODE) {
            if (resultCode == RESULT_OK && data != null) {
                String scanResult = data.getStringExtra("SCAN_RESULT");
                barcodeEt.setText(scanResult);
            } else {
                Toast.makeText(this, "取消扫描", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

2. 扫描Activity返回结果的代码和方式一一致(Java版本)

// Java 代码示例
// 扫描成功后拿到barcodeStr
Intent resultIntent = new Intent();
resultIntent.putExtra("SCAN_RESULT", barcodeStr);
setResult(RESULT_OK, resultIntent);
finish();
注意事项
  • 确保你的扫描Activity已经在AndroidManifest.xml中正确注册,比如:
<activity android:name=".BarcodeScanActivity"/>
  • 如果是用第三方条码扫描库(比如ZXing),获取扫描结果的逻辑可能会和库的API有关,但核心都是通过setResult把结果传递回前一个页面
  • 可以自定义传递的Extra键名,不一定非要用SCAN_RESULT,只要前后两个Activity保持一致就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:20:54