在TSD上的应用以及通过HTTP服务与1C:Enterprise 8.3的通信。 第4部分(带有键盘仿真的OnKeyUp。SC扫描器)

1.交换方式的选择。 API说明。

2.在1C方面实现API。

3. BroadcastReceiver。 我们得到数据

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) 

它遵循
事实 onKeyUponKeyDown仅适用于未重新定义OnKeyListener的字段。 而且只有在这个领域。

事实3.如果将1.1.1版的ATOL Lite.Droid设置为前缀,则不会传递KeyEvent = KEYCODE_TAB。 前缀1和前缀2都没有。 我没有在后缀中尝试。 那里不需要他。

事实4. onKeyUp,onKeyDown,setOnKeyListener-仅侦听硬件单击。 键盘,具有键盘仿真功能的扫描仪,奇怪的是,屏幕上的后退按钮也是硬件按钮(KEYCODE_BACK)。 TSD上的数字按钮(物理)是软按钮。 为什么会这样,我听不懂:)好吧,好吧。

现在有点理论。

内置的条形码扫描仪无法发送广播。 并且有带有键盘仿真功能的条形码扫描仪。 我认为这种方法也适合他们。 在两种情况下,我建议您将“前缀”设置为例如等于"="(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) } 

仅此而已。 与往常一样,欢迎发表评论和添加内容。

Source: https://habr.com/ru/post/zh-CN473818/


All Articles