覆盖Android上的删除键?

时间:2013-01-14 11:59:39

标签: java android serial-port

我主要用dispatchKeyEvent中的这些行解决了这个问题:

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);

现在唯一的问题是,如果我选择editText并点击删除,则会删除一个字符,但屏幕上会显示两个字符。因此,如果我写启用并点击删除它将改为enab但实际发送的是enabl

我覆盖了dispatchKeyEvent,它有点工作。如果选择了editText,终端现在会删除序列中的字符,这是一个很好的步骤。然而,主要问题仍然存在,如果自己选择终端,则将奇怪的小盒子写入屏幕而不是删除字符。好吧一个是写的,如果我一直按下删除它会停留在那个盒子上,但是下次我输入删除的数量时我按下了框。这很奇怪......

它只是覆盖了edittext而不是终端。

他们所有荣耀中都有奇怪的小盒子:

Enter image description here

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中的库连接到终端模拟器,它连接到串行设备(交换机)并显示发送/接收的数据。我通过终端下方的文本框通过连接发送数据,或者通过键入终端本身并在两种情况下按键盘输入。它只会是一个使用的软键盘。如果我发送了一个不正确的字符串,由于没有删除密钥实现,我处于不可恢复的状态。我的editTxt中的退格处理工作正常,我只是希望它在终端突出显示时工作,而我正在写这篇文章。

目前,如果我按下删除,会出现一个奇怪的盒子,并且没有其他任何事情发生,我会在日志中有一些异常(http://i.imgur.com/wMRaLPX.png)。我想知道的是如何更改删除键功能,以便当我按下它时,我可以发送这样的删除字符,但也保留删除edittext框中的字符等功能:

sendOverSerial("\b".getBytes("UTF-8"))

这会发送一个正确的后退空间,我只需要将其合并。

但软键盘似乎没有注册按键?我一直得到一个0的键码,只有输入才有效。

我目前正在尝试https://stackoverflow.com/questions/4...62035_11377462,但任何其他建议都会很棒,因为到目前为止,大约有10条建议无法使用。我的退格区不会与editText相关联,而是与终端视图相关联。我甚至无法检测到正在按下的删除键。

3 个答案:

答案 0 :(得分:4)

看起来你正在使用的终端控件必须使用KEYCODE_DEL而不是让它传播到窗口,并且它必须向远程端发送不同的char而不是\ b。因此,当您的编辑文本被聚焦时,您的dispatchKeyEvent正在处理印刷机 - 但是当终端具有焦点时您没有看到它。你确认当终端有焦点时偶数处理程序是通过调试器触发的吗?您没有说明您使用哪个库作为终端,但我会查看它,看看您是否可以设置密钥处理程序等。

答案 1 :(得分:2)

我对Android没有任何经验,我也承认我从未试图实现删除/退格键绑定。但是,如果我试图这样做,并且我不知道一个好的标准实现,我可以想到一个可能正常运行的解决方法。使用关联的动作侦听器对要删除的键进行绑定。将动作侦听器getText()从文本字段中移出并将其存储为String。子串,该字符串包括除最后一个字符之外的所有内容。然后使用setText()作为带有新字符串的文本字段。这是一种手动的方式,但肯定会有效。

答案 2 :(得分:0)

解决方案是将写入屏幕的方法移动到另一个类,然后一切正常。