Home > Net >  I'm having issues with the dispatchKeyEvent(), I have a physical scanner and would like to rece
I'm having issues with the dispatchKeyEvent(), I have a physical scanner and would like to rece

Time:04-28

this works but the problem is that the back press button doesn't work but if I return return super.superDispatchKeyEvent(event) it works but my menu drawer opens when button is clicked

@SuppressLint("RestrictedApi")
override fun dispatchKeyEvent(event: KeyEvent): Boolean {


    if (event.action == KeyEvent.ACTION_DOWN) {
        val pressedKey = event.unicodeChar.toChar()
        barcode.append(pressedKey)

    }
    if (event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER) {

        Toast.makeText(this, "Barcode; $barcode",  Toast.LENGTH_LONG).show()
        barcode.delete(0, barcode.length)

    }

    return false
}

after changing it to the answer below, the toast message doesn't show a barcode

private val barcode = StringBuffer()

@SuppressLint("RestrictedApi")
override fun dispatchKeyEvent(event: KeyEvent): Boolean {

    if (event.action == KeyEvent.ACTION_DOWN) {
        if (event.keyCode == KeyEvent.KEYCODE_ENTER) {

            val pressedKey = event.unicodeChar.toChar()
            barcode.append(pressedKey)

            return true

        } else if (barcode.isNotBlank()){

            Toast.makeText(this, "Barcode; $barcode",  Toast.LENGTH_LONG).show()
            Log.d("scannerBarcoe", "$barcode")
            barcode.delete(0, barcode.length)

            return true

        }
    }
    return super.dispatchKeyEvent(event);
}

CodePudding user response:

You don't want to do either of those things. This function is supposed to return true if the event is consumed. You're consuming those keystrokes. You should return true in both of those keystrokes, and super.dispatchKeyEvent only if both fail.

Also, your first case is way too broad (it will catch every down event, which isn't what you want), and could screw up the second. You should be doing:

if (event.action == KeyEvent.ACTION_DOWN) {
  if(event.keyCode == KeyEvent.KEYCODE_ENTER) {
    //handle a delete key
    return true

  }
  else if(/*test if this is a legal barcode character*/) {
    //handle  barcode key
    return true

  }
}
return super.dispatchKeyEvent(event);

CodePudding user response:

I've figured it out with the solution below


  private val barcode = StringBuffer()

  @SuppressLint("RestrictedApi")
    override fun dispatchKeyEvent(event: KeyEvent): Boolean {


        if (event.action == KeyEvent.ACTION_DOWN) {
            
            val pressedKey = event.unicodeChar.toChar()
            barcode.append(pressedKey)

            if (event.keyCode == KeyEvent.KEYCODE_ENTER) {

                Toast.makeText(this, "Barcode; $barcode", Toast.LENGTH_LONG).show()
                Log.d("scannerBarcoe", "$barcode")
                barcode.delete(0, barcode.length)

                return true

            }
        }
        return super.dispatchKeyEvent(event);
    }
  • Related