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

使用GmsBarcodeScanning扫描条码后,Fragment中EditText无法显示内容求助

问题:扫描条码后Fragment视图重置,EditText无法保留扫描内容

我有一个包含EditText和若干按钮的Fragment,其中一个按钮通过GmsBarcodeScanning库实现条码扫描功能。预期扫描成功后,条码内容会显示在EditText中,但实际功能失效——扫描完成后onCreateView会被调用,导致所有组件重置,输入的条码内容丢失。

相关代码如下:

class SelecComanda : Fragment() {

private var et_codi: EditText? = null
private var btn_scan: Button? = null
private var btn_next: Button? = null

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val root = inflater.inflate(R.layout.selec_comanda, container, false)
    et_codi = root.findViewById(R.id.editTextCodi)
    btn_scan = root.findViewById(R.id.boto_scan)
    btn_next = root.findViewById(R.id.button_second)
    return root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    btn_next!!.isEnabled = false

    btn_next!!.setOnClickListener {
        // TODO
    }

    btn_scan!!.setOnClickListener {
        val options = GmsBarcodeScannerOptions.Builder()
            .enableAutoZoom()
            .build()
        val scanner = GmsBarcodeScanning.getClient(this.context!!, options)

        scanner.startScan()
            .addOnSuccessListener { barcode ->
                et_codi!!.setText(barcode.rawValue.toString())
                btn_next!!.setEnabled(true)
        }
        .addOnCanceledListener {
            // TODO
        }
        .addOnFailureListener { e ->
            // TODO
        }
    }
}
}

解决方案

1. 用实例变量持久化扫描结果

在Fragment类中添加一个实例变量存储扫描到的条码值,确保视图重建时数据不会丢失:

class SelecComanda : Fragment() {
    // 新增变量保存扫描结果
    private var scannedBarcode: String? = null
    private var et_codi: EditText? = null
    private var btn_scan: Button? = null
    private var btn_next: Button? = null
    // ... 其余代码
}

2. 在视图创建后恢复数据

每次onViewCreated执行时,将保存的条码值填充到EditText,并同步按钮状态:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    // 恢复扫描结果与按钮状态
    scannedBarcode?.let {
        et_codi?.setText(it)
        btn_next?.isEnabled = true
    } ?: run {
        btn_next?.isEnabled = false
    }

    btn_next?.setOnClickListener {
        // TODO
    }

    btn_scan?.setOnClickListener {
        val options = GmsBarcodeScannerOptions.Builder()
            .enableAutoZoom()
            .build()
        val scanner = GmsBarcodeScanning.getClient(requireContext(), options)

        scanner.startScan()
            .addOnSuccessListener { barcode ->
                scannedBarcode = barcode.rawValue.toString()
                et_codi?.setText(scannedBarcode)
                btn_next?.isEnabled = true
            }
            .addOnCanceledListener {
                // TODO
            }
            .addOnFailureListener { e ->
                // TODO
            }
    }
}

3. 替换非空断言(!!)为安全调用

代码中大量使用的!!存在空指针风险,改用?.安全调用或requireContext()替代context!!,提升代码稳定性。

4. 可选:应对配置变更(如屏幕旋转)

如果需要处理屏幕旋转等配置变更导致的Fragment重建,重写onSaveInstanceState保存扫描结果:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("SCANNED_BARCODE", scannedBarcode)
}

// 在onViewCreated中恢复
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 从Bundle恢复数据
    savedInstanceState?.let {
        scannedBarcode = it.getString("SCANNED_BARCODE")
    }
    // ... 其余恢复逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:34:53