簡體   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