后退按钮以退出 MVVM 中的 Zxing 扫描仪

back button to escape Zxing scanner in MVVM

我一直在尝试使用 zxing 库,但我无法让它正常工作。

我创建了一个布局 xml、一个视图模型和一个片段,因为我的项目是 MVVM 模式。 最初,它显示了我的布局视图。但问题是 Zxing 在库中有自己的屏幕,它用它扫描代码。 所以发生的事情是当按下后退按钮时,我无法返回但它会关闭自己的屏幕然后显示我的布局。结果,我必须按两次后退按钮才能退出 zxing 扫描仪和我的布局视图。

任何帮助将不胜感激。

我试过的

  1. 我将 onBackPressed 设置为返回两个堆栈。但是在zxing扫描仪之后它仍然显示我的布局。
  2. 我试图在我的布局上调用扫描仪 xml 但由于同样的原因没有成功。

我想做什么 按一次后退按钮退出二维码扫描仪屏幕。

fragment

class QrScanFragment  : Fragment() {

private lateinit var binding: FragmentQrScanBinding
private lateinit var viewModel: QrScanViewModel
private lateinit var mContext: MainActivity
private lateinit var callback : OnBackPressedCallback

override fun onAttach(context: Context) {
    super.onAttach(context)
    mContext = context as MainActivity
    callback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            Timber.d("onBackPressed")
            findNavController().popBackStack()
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(this, callback)
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_qr_scan, container, false)
    return binding.root
}

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

    viewModel = ViewModelProvider(this).get(QrScanViewModel::class.java)
    binding.viewModel = viewModel
    binding.lifecycleOwner = viewLifecycleOwner

    val integrator = IntentIntegrator.forSupportFragment(this@QrScanFragment)
    integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)
    integrator.setPrompt("Scan code")
    integrator.setCameraId(0)
    integrator.setBeepEnabled(false)
    integrator.setBarcodeImageEnabled(true)
    integrator.initiateScan()

}

override fun onDetach() {
    super.onDetach()
    callback.remove()
}
}

xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <variable
        name="viewModel"
        type="com.project.view.qrScan.QrScanViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

viewModel

class QrScanViewModel: ViewModel(){}

使用 onActivityResult 获取回调。从此回调中,您可以关闭您的视图

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(result != null) {
        if(result.getContents() == null) {
            //Dismiss your view if Zxing was cancelled
        } else {
            //Zxing returned with result, you could should the result or dismiss your view
        }
    } else {
        // This is important, otherwise the result will not be passed to the fragment
        super.onActivityResult(requestCode, resultCode, data);
    }
}