Aplicativo no TSD e comunicação com 1C: Enterprise 8.3 através do serviço HTTP. Parte 4 (scanner OnKeyUp. SC com emulação de teclado)

1. A escolha do método de troca. Descrição da API.

2. Implementação da API ao lado de 1C.

3. BroadcastReceiver. Nós obtemos os dados

4. OnKeyUp. Leitor de código de barras com emulação de teclado


Este artigo deveria ser o mais curto. Mas o diabo está nos detalhes. Aqui estão alguns fatos.

Fato 1. Se tivermos vários campos EditText no formulário e, OnKeyListener tudo, redefinirmos OnKeyListener , onKeyUp e onKeyDown serão sombreados e não serão mais chamados. 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) 

Segue
Fato 2. onKeyUp e onKeyDown funcionam apenas para os campos para os quais OnKeyListener não é redefinido. E somente quando neste campo.

Fato 3. O ATOL Lite.Droid na versão 1.1.1 não passa KeyEvent = KEYCODE_TAB se estiver definido como um prefixo. Nem no prefixo1 nem no prefixo2. Eu não tentei no sufixo. Ele não é necessário lá.

Fato 4. onKeyUp, onKeyDown, setOnKeyListener - ouça apenas cliques de hardware. Um teclado, um scanner com emulação de teclado e, estranhamente, o botão Voltar na tela também é um botão de hardware (KEYCODE_BACK). E os botões digitais (físicos) no TSD são botões programáveis. Por que sim, eu não entendi :) Bem, tudo bem.

Agora um pouco de teoria.

Existem scanners de código de barras integrados que não podem enviar Broadcast. E existem scanners de código de barras com emulação de teclado. Eu acho que esse método também é adequado para eles. Nos dois casos, aconselho que você defina o "prefixo", por exemplo, igual a "="(KEYCODE_EQUALS) . E substitua o sufixo por "CR"(KEYCODE_ENTER) . Remova todos os outros sufixos e prefixos. A maioria dos scanners com emulação de teclado nas configurações padrão não possui um prefixo, mas podem fornecer CRLF (dois caracteres. Retorno de carro, avanço de linha). Parece que aconteceu historicamente.

Agora a própria implementação. Na classe MainActivity, crie duas variáveis. O primeiro é responsável pela concatenação dos caracteres do código de barras, o segundo é o código de barras a ser coletado em uma linha entre o prefixo e o sufixo.

 val barcodeStringBuilder = StringBuilder() var isReadingBarcode = false 

E na classe você precisa substituir a função 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) } 

Só isso. Como sempre, comentários e acréscimos são bem-vindos.

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


All Articles