1. La elección del método de intercambio. Descripción de la API.2. Implementación de la API en el lado de 1C.3. BroadcastReceiver. Obtenemos los datos4. OnKeyUp. Escáner de código de barras con emulación de teclado
Se suponía que este artículo era el más corto. Pero el diablo está en los detalles. Aquí hay algunos hechos.
Hecho 1. Si tenemos varios campos
EditText
en el formulario, y para todos redefinimos
OnKeyListener
, onKeyUp y onKeyDown están sombreados y ya no se llaman. Código
class MainActivity : AppCompatActivity() { var keyListener: View.OnKeyListener = View.OnKeyListener { _, _, _ -> true} override fun onCreate(savedInstanceState: Bundle?) { val editBarcode = findViewById(R.id.editBarcode) editBarcode.setOnKeyListener (keyListener) val editQuantity: EditText = findViewById(R.id.editQuantity) editQuantity.setOnKeyListener(keyListener)
Sigue
Hecho 2. onKeyUp
y
onKeyDown
funcionan solo para aquellos campos para los que OnKeyListener no está redefinido. Y solo cuando en este campo.
Hecho 3. ATOL Lite.Droid en la versión 1.1.1 no pasa KeyEvent = KEYCODE_TAB si está configurado como prefijo. Ni en el prefijo1 ni en el prefijo2. No lo intenté en el sufijo. No es necesario allí.
Hecho 4. onKeyUp, onKeyDown, setOnKeyListener: escuche solo los clics de hardware. Un teclado, un escáner con emulación de teclado y, curiosamente, el botón de retroceso en la pantalla también es un botón de hardware (KEYCODE_BACK). Y los botones digitales (físicos) en el TSD son botones suaves. Por qué, no entendí :) Bueno, está bien.
Ahora una pequeña teoría.
Hay escáneres de códigos de barras integrados que no pueden enviar Broadcast. Y hay escáneres de códigos de barras con emulación de teclado. Creo que este método también es adecuado para ellos. En ambos casos, le aconsejo que configure el "prefijo", por ejemplo, igual a
"="(KEYCODE_EQUALS)
. Y reemplace el sufijo con
"CR"(KEYCODE_ENTER)
. Elimine todos los demás sufijos y prefijos. La mayoría de los escáneres con emulación de teclado en la configuración estándar no tienen un prefijo, pero están contentos de dar
CRLF
(dos caracteres. Retorno de carro, avance de línea). Parece que sucedió históricamente.
Ahora la implementación en sí. En la clase MainActivity, cree dos variables. El primero es responsable de la concatenación de los caracteres del código de barras, el segundo es para que el código de barras se recopile en una línea entre el prefijo y el sufijo.
val barcodeStringBuilder = StringBuilder() var isReadingBarcode = false
Y en la clase, debe anular la función
onKeyUp
. override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
Eso es todo. Como siempre, los comentarios y adiciones son bienvenidos.