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

back button to escape Zxing scanner in MVVM(后退按钮以退出MVVM中的Zxing扫描仪)
本文介绍了后退按钮以退出MVVM中的Zxing扫描仪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试使用ZXING库,但无法使其正常工作。

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

我们将非常感谢您的帮助。

我尝试的内容

  1. 我设置了On BackPressed以支持两个堆栈。但在ZXING扫描仪之后它仍然显示我的布局。
  2. 我尝试对我的布局XML调用扫描器,但由于同样的原因未成功。

我想做什么 按一次后退按钮可退出QR扫描仪屏幕。

片段

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);
    }
}

这篇关于后退按钮以退出MVVM中的Zxing扫描仪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to target newer versions in .gitlab-ci.yml using auto devops (java 11 instead of 8 and Android 31 instead of 29)(如何在.gitlab-ci.yml中使用自动开发工具(Java 11而不是8,Android 31而不是29)瞄准较新的版本)
Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?(Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?)
How to render something in an if statement React Native(如何在If语句中呈现某些内容Reaction Native)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)
Using Firebase Firestore in offline only mode(在仅脱机模式下使用Firebase FiRestore)
Crash on Google Play Pre-Launch Report: java.lang.NoSuchMethodError(Google Play发布前崩溃报告:java.lang.NoSuchMethodError)