- PVSM.RU - https://www.pvsm.ru -

Приложение на ТСД и связь с 1С: Предприятие 8.3 через HTTP-Сервис. Часть 4 (OnKeyUp. Сканер ШК с эмуляцией клавиатуры)

1. Выбор способа обмена. Описание API. [1]

2. Реализация API на стороне 1С. [2]

3. BroadcastReceiver. Получаем данные [3]

4. OnKeyUp. Сканер ШК с эмуляцией клавиатуры

Эта статья должна была стать самой короткой. Но дьявол в деталях. Вот несколько фактов.

Факт 1. Если у нас на форме есть несколько полей EditText, и для всех мы переопределим OnKeyListener, то onKeyUp и onKeyDown затеняются и больше не вызываются. Код.

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)

Из этого следует
Факт 2. onKeyUp и onKeyDown срабатывают только для тех полей, для которых не переопределен OnKeyListener. И только при нахождении в данном поле.

Факт 3. АТОЛ Lite.Droid в версии 1.1.1 не передает KeyEvent = KEYCODE_TAB если он выставлен в качестве префикса. Ни в префикс1, ни в префикс2. В суффикс я его не пробовал. Он там не нужен.

Факт 4. onKeyUp, onKeyDown, setOnKeyListener — слушают только аппаратные нажатия. Клавиатура, сканер с эмуляцией клавиатуры, и как ни странно, кнопка «назад» на экране, это тоже аппаратная кнопка («KEYCODE_BACK»). А цифровые кнопки(физические) на ТСД это — программные кнопки. Почему так, я не понял :) Ну да ладно.

Теперь немного теории.

Есть встроенные сканеры ШК которые не могут отправлять Broadcast. А есть сканеры ШК с эмуляцией клавиатуры. Думаю для них данный способ тоже подойдет. В обоих случаях я советую выставить «префикс» например равный"="(KEYCODE_EQUALS). И заменить суффикс на "CR"(KEYCODE_ENTER). Все остальные суффиксы и префиксы убрать. Большинство сканеров с эмуляцией клавиатуры в стандартных настройках не имеют префикса, но при этом с радостью отдают CRLF(Два символа. Перевод каретки, перенос строки). Видать исторически так сложилось.

Теперь сама реализация. В классе MainActivity создаем две переменных. Первая отвечает за конкатенацию символов ШК, вторая за то, чтобы штрих код собрался в строку между префиксом и суфиксом.

val barcodeStringBuilder = StringBuilder()
var isReadingBarcode = false

А в классе нужно переопределить функцию 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)
    }

На этом все. Как всегда комментарии и дополнения приветствуются.

Автор: loki82

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/api/334955

Ссылки в тексте:

[1] 1. Выбор способа обмена. Описание API.: https://habr.com/ru/post/473500/

[2] 2. Реализация API на стороне 1С.: https://habr.com/ru/post/473546/

[3] 3. BroadcastReceiver. Получаем данные: https://habr.com/ru/post/473574/

[4] Источник: https://habr.com/ru/post/473818/?utm_campaign=473818&utm_source=habrahabr&utm_medium=rss