后退按钮以退出 MVVM 中的 Zxing 扫描仪
back button to escape Zxing scanner in MVVM
我一直在尝试使用 zxing 库,但我无法让它正常工作。
我创建了一个布局 xml、一个视图模型和一个片段,因为我的项目是 MVVM 模式。
最初,它显示了我的布局视图。但问题是 Zxing 在库中有自己的屏幕,它用它扫描代码。
所以发生的事情是当按下后退按钮时,我无法返回但它会关闭自己的屏幕然后显示我的布局。结果,我必须按两次后退按钮才能退出 zxing 扫描仪和我的布局视图。
任何帮助将不胜感激。
我试过的
- 我将 onBackPressed 设置为返回两个堆栈。但是在zxing扫描仪之后它仍然显示我的布局。
- 我试图在我的布局上调用扫描仪 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);
}
}
我一直在尝试使用 zxing 库,但我无法让它正常工作。
我创建了一个布局 xml、一个视图模型和一个片段,因为我的项目是 MVVM 模式。 最初,它显示了我的布局视图。但问题是 Zxing 在库中有自己的屏幕,它用它扫描代码。 所以发生的事情是当按下后退按钮时,我无法返回但它会关闭自己的屏幕然后显示我的布局。结果,我必须按两次后退按钮才能退出 zxing 扫描仪和我的布局视图。
任何帮助将不胜感激。
我试过的
- 我将 onBackPressed 设置为返回两个堆栈。但是在zxing扫描仪之后它仍然显示我的布局。
- 我试图在我的布局上调用扫描仪 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);
}
}