使用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
相关产品推荐
相关产品推荐

