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 dados4. 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 {
Só isso. Como sempre, comentários e acréscimos são bem-vindos.