Android,将数据传递给 viewModel,然后在视图上进行操作

Android, passing data to the viewModel and then do work on the view

为了更好地理解 MVVM,我决定重做我的一个 Android 项目来实现该架构。

其中一项活动使用Zxing图书馆扫描二维码。使用 Zxing 的事件处理程序,我想将扫描结果传递给我的 viewModel 以检查结果是否为 "product"(这是我在产品 class 之后生成的二维码)。如果结果是一个产品,它会显示一个对话框,询问用户是否要继续扫描或保存该产品,如果它不是一个产品,那么它会显示一个对话框,一个结果和一个取消按钮。

现在的问题是我不知道如何正确地将数据从 Zxing 的处理程序传递到 viewModel。下面附上我的activity.

class QRreader_Activity : AppCompatActivity(), ZXingScannerView.ResultHandler, IQRreader{
override fun isProduct(ProductDetail: String) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun isNotProduct(ScannedText: String) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}


lateinit var mScannerView: ZXingScannerView
var data: String="test"

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_qrreader)


    val bReturn: ImageButton = findViewById(R.id.ic_return)
    bReturn.setOnClickListener {
        onBackPressed() }
    ActivityCompat.requestPermissions(this@QRreader_Activity,
            arrayOf(Manifest.permission.CAMERA),
            1)

    val flashlightCheckBox = findViewById<CheckBox>(R.id.flashlight_checkbox)

    val contentFrame = findViewById<ViewGroup>(R.id.content_frame)
    mScannerView = object : ZXingScannerView(this) {
        override fun createViewFinderView(context: Context): IViewFinder {
            return CustomViewFinderView(context)
        }
    }

    contentFrame.addView(mScannerView)
    flashlightCheckBox.setOnCheckedChangeListener { compoundButton, isChecked -> mScannerView.flash = isChecked }
}

public override fun onResume() {
    super.onResume()
    mScannerView.setResultHandler(this) // Register ourselves as a handler for scan results.
    mScannerView.startCamera()          // Start camera on resume
}

public override fun onPause() {
    super.onPause()
    mScannerView.stopCamera()           // Stop camera on pause
}

override fun onBackPressed() {
    super.onBackPressed()
    val intent = Intent(this, MainActivity::class.java)
    startActivity(intent)
    finish()
}
//This is where ZXing provides the result of the scan
override fun handleResult(rawResult: Result) {
    Toast.makeText(this,""+rawResult.text,Toast.LENGTH_LONG).show()

}

private class CustomViewFinderView : ViewFinderView {
    val PAINT = Paint()

    constructor(context: Context) : super(context) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init()
    }

    private fun init() {
        PAINT.color = Color.WHITE
        PAINT.isAntiAlias = true
        val textPixelSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
                TRADE_MARK_TEXT_SIZE_SP.toFloat(), resources.displayMetrics)
        PAINT.textSize = textPixelSize
        setSquareViewFinder(true)
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        drawTradeMark(canvas)
    }

    private fun drawTradeMark(canvas: Canvas) {
        val framingRect = framingRect
        val tradeMarkTop: Float
        val tradeMarkLeft: Float
        if (framingRect != null) {
            tradeMarkTop = framingRect.bottom.toFloat() + PAINT.textSize + 10f
            tradeMarkLeft = framingRect.left.toFloat()
        } else {
            tradeMarkTop = 10f
            tradeMarkLeft = canvas.height.toFloat() - PAINT.textSize - 10f
        }
        canvas.drawText(TRADE_MARK_TEXT, tradeMarkLeft, tradeMarkTop, PAINT)
    }

    companion object {
        val TRADE_MARK_TEXT = ""
        val TRADE_MARK_TEXT_SIZE_SP = 40
    }
}

}

我找到的解决方案是让视图模型实现 "ZXingScannerView.ResultHandler" 接口。我不知道这是否是最佳解决方案。