Aplicación en TSD y comunicación con 1C: Enterprise 8.3 a través del servicio HTTP. Parte 4 (OnKeyUp. Escáner SC con emulación de teclado)

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 datos

4. 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 { // ,  ().   .         . if (event?.keyCode == KeyEvent.KEYCODE_EQUALS ){ barcodeStringBuilder.clear() isReadingBarcode = true return true } //     .  ,      . if (isReadingBarcode) { barcodeStringBuilder.append(event?.getUnicodeChar()?.toChar()) } //    ,      .       . if ((event?.keyCode == KeyEvent.KEYCODE_ENTER) && isReadingBarcode) { Log.d("BarcodeDebug", "$barcodeStringBuilder") setTextBarcode(barcodeStringBuilder.toString()) //  .    . isReadingBarcode = false return true } //     . return super.onKeyUp(keyCode, event) } 

Eso es todo. Como siempre, los comentarios y adiciones son bienvenidos.

Source: https://habr.com/ru/post/473818/


All Articles