繁体   English   中英

Android,将数据传递到viewModel,然后在视图上工作

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

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

其中一项活动是使用Zxing库扫描QR码。 使用Zxing的事件处理程序,我想将扫描的结果传递到我的viewModel中,以检查结果是否为“产品”(这是我根据产品类生成的QR码)。 如果结果是产品,则将显示一个对话框,并显示结果,询问用户是否要继续扫描或保存该产品;如果不是产品,则将显示一个对话框,并显示结果和取消按钮。

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

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”接口。 我不知道这是否是最佳解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM