В настоящее время я работаю над приложением, которое использует сканер штрих-кода для сканирования некоторых штрих-кодов. Итак, я собираю данные, перегружая метод dispatchKeyEvent . Все работает хорошо, пока я не пытаюсь постобработать предложенный штрих-код.
Например, этот фрагмент кода работает, как и ожидалось.
private var promptedEAN:String = ""
override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
if(event?.action == KeyEvent.ACTION_DOWN) {
val pressedKey: Char = event.getUnicodeChar().toChar()
promptedEAN += pressedKey
val eTMengeKomm = findViewById<EditText>(R.id.eTMengeKomm)
eTMengeKomm.setText(promptedEAN, TextView.BufferType.EDITABLE)
val etCharge = findViewById<EditText>(R.id.eTCharge)
etCharge.setText(promptedEAN, TextView.BufferType.EDITABLE)
val etMHD = findViewById<EditText>(R.id.eTMHD)
etMHD.setText(promptedEAN, TextView.BufferType.EDITABLE)
}
return super.dispatchKeyEvent(event)
}
НО , как только я хочу постобработать запрашиваемый штрих-код внутри dispatchKeyEvent метод, все приложение зависает . В этом случае мне нужно перейти в Настройки -> Приложение -> Принудительно остановить, чтобы убить мое приложение, потому что ни одна из кнопок не работает.
Мой код постобработки работает без проблем - я опробовал его с помощью тестовой строки в методе onCreate моей деятельности.
У меня вопрос почему я получаю такое поведение с помощью метода dispatchKeyEvent ?
Это мой код. Я заполняю HashMap парами ключ-значение в методе OnCreate , который запускается до запуска dispatchKeyEvent .
private var promptedEAN:String = ""
private var testPromptedEAN:String = "" //"C10207613037926927200015200600370098$1092547017L4"
private val hashMap : HashMap<String, Int> = HashMap()
override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
if(event?.action == KeyEvent.ACTION_DOWN) {
val pressedKey: Char = event.getUnicodeChar().toChar()
promptedEAN += pressedKey
testPromptedEAN = promptedEAN
val eTMengeKomm = findViewById<EditText>(R.id.eTMengeKomm)
eTMengeKomm.setText(promptedEAN, TextView.BufferType.EDITABLE)
val etCharge = findViewById<EditText>(R.id.eTCharge)
etCharge.setText(promptedEAN, TextView.BufferType.EDITABLE)
val etMHD = findViewById<EditText>(R.id.eTMHD)
etMHD.setText(promptedEAN, TextView.BufferType.EDITABLE)
if (testPromptedEAN.contains("C1",true) or testPromptedEAN.contains("C0",true)) { // EAN-128 Code
var pos:Int = 2 // init pos
var tail:String = testPromptedEAN.substring(pos) // init tail
var lookInString:String =""
while (pos<testPromptedEAN.length-1) {
var searchString:String = testPromptedEAN.substring(pos, pos+2) // look into 2-digit codes first
if (hashMap.containsKey(searchString)){
var lengthData4code:Int = hashMap.getValue(searchString) // get length of data for code from hash table
if (tail.length<lengthData4code){
lengthData4code = tail.length
lookInString = tail.substring(searchString.length, lengthData4code)
} else {
lookInString = tail.substring(searchString.length, searchString.length+lengthData4code) // data (part)string
}
if (lookInString.indexOf("$")>=0) { // string size is actually shorter than expected
lookInString = tail.substring(searchString.length,searchString.length+lookInString.indexOf("$"))
pos += (searchString.length + lookInString.length + 1)
} else {
pos += (searchString.length+ lengthData4code)
}
if (pos>=testPromptedEAN.length-1) {tail = ""}
else {tail = testPromptedEAN.substring(pos)}
if (searchString.contains("37", false)) {
//val eTMengeKomm = findViewById<EditText>(R.id.eTMengeKomm)
eTMengeKomm.setText(lookInString, TextView.BufferType.EDITABLE)
}
if (searchString.contains("10", false)) {
//val etCharge = findViewById<EditText>(R.id.eTCharge)
etCharge.setText(lookInString, TextView.BufferType.EDITABLE)
}
if (searchString.contains("15", false)) {
//val etMHD = findViewById<EditText>(R.id.eTMHD)
etMHD.setText(lookInString, TextView.BufferType.EDITABLE)
}
}
}
}
}
return super.dispatchKeyEvent(event)
}
Любая помощь высоко ценится.