Override delete key on Android?
我在DispatchKeyEvent中主要解决了这些行的问题:
1 2 3 4 5 6 | byte[] cmdLeft = { (byte) 27, (byte) '[', (byte) 'D' }; byte[] cmdErase = { (byte) 27, (byte) '[', (byte) 'P' }; mSession.appendToEmulator(cmdLeft, 0, cmdLeft.length); mSession.appendToEmulator(cmdErase, 0, cmdErase.length); |
现在唯一的问题是,如果我选择编辑文本并点击删除,那么一个字符会被删除,但两个字符会出现在屏幕上。所以如果我写"启用"并点击"删除",它将变为"启用",但实际发送的是"启用"。
我骑上了Dispatchkeyevent,这是一种工作。如果选择了edittext,终端现在就可以通过串行删除字符,这是一个很好的步骤。但是,主要的问题仍然存在,如果终端本身被选中,那么奇怪的小方框将被写入屏幕,而不是删除字符。好吧,一个是写的,如果我一直按删除键,它会停留在那个框中,但是下次我键入我所按的删除量时,它会显示为框。很奇怪…
就好像它只是被edittext覆盖,而不是被终端覆盖。
在他们所有的荣耀中的奇怪的小盒子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public boolean dispatchKeyEvent(KeyEvent event) { if (event != null && event.getAction() == KeyEvent.ACTION_UP) { return false; } if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) { try { sendOverSerial("\b".getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return super.dispatchKeyEvent(event); }; |
我正在使用Android中的一个库连接到一个终端模拟器,它连接到一个串行设备(一个交换机),并显示我发送/接收的数据。我通过终端下面的一个文本框发送数据,或者通过键入终端本身并在两种情况下按键盘上的Enter来发送数据。它只能是一个使用的软键盘。如果发送的字符串不正确,则由于没有删除键实现,因此处于不可恢复状态。我的edittxt中的backspace工作得很好,我只希望它在终端突出显示并且我正在写的时候工作。
现在,如果我按下删除键,一个小的奇怪的方框字符出现,而没有发生其他事情,我有时会在日志中得到一个异常(http://i.imgur.com/wmrapx.png)。我想知道的是如何更改"删除键"功能,以便当我按下它时,可以发送这样的删除字符,但也可以保留在编辑文本框中删除字符的功能等:
1 | sendOverSerial("\b".getBytes("UTF-8")) |
这发送了一个正确的背景空间,我只需要合并它。
但软键盘似乎没有注册按键?我一直得到一个0的键码,只有回车键才有效。
我目前正在尝试https://stackoverflow.com/questions/4…62035 U 11377462,但是任何其他建议都是很好的,因为到目前为止大约有10个建议还没有起作用。我的退格键不会与EditText关联,而是与终端视图关联。我甚至检测不到正在按下的删除键。
看起来您使用的终端控件必须使用keycode del而不是让它传播到窗口,并且它必须向远程端发送不同的char而不是。因此,当您的编辑文本聚焦时,DispatchKeyEvent正在处理新闻-但当终端聚焦时,您看不到它。当终端有焦点时,是否确认偶数处理程序正在通过调试器触发?您没有说您在终端上使用的是哪个库,但我会看看这个库,看看您是否可以设置一个键处理程序或其他什么。
我对Android没有任何经验,我也承认我从未尝试过实现删除/退格键绑定。但是,如果我尝试这样做,并且我不知道一个好的标准实现,那么我可以考虑一个可以正常工作的解决方案。使用关联的操作侦听器进行要删除的键绑定。使操作侦听器getText()脱离文本字段,并将其存储为字符串。子字符串包含除最后一个字符以外的所有内容。然后将settext()用于带有新字符串的文本字段。这是一种手动的方式,但肯定会起作用。
我建议捕获完整的字符串,并在用户按下SEnd时立即发送,就像一个聊天程序一样。
解决方案是将写入屏幕的方法移动到另一个类,然后一切都正常工作。