简体   繁体   中英

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

In hopes to better understand MVVM I decided to redo one of my Android projects implementing the architecture.

One of the activities uses the Zxing library to scan a QR code. Using Zxing's event handler I would like to pass the scanned result to my viewModel to check for example if the result is a "product"(this is a QR code I generate following a product class) or not. If the the result is a product it will show a dialogue with the result asking the user if they want to continue scanning or save the product, if it is not a product then it shows a dialogue with the result and a cancel button.

Now the issue here is that I don't know how to properly pass the data from Zxing's handler to the viewModel. Below attached my 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
    }
}

}

The solution I found was to have the view model implement "ZXingScannerView.ResultHandler" interface. I don't know if this is the optimal solution though.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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