【问题标题】:Override delete key on Android?覆盖Android上的删除键?
【发布时间】:2012-12-28 09:19:31
【问题描述】:

我主要解决了 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 并点击删除,那么一个字符会被删除,但两个字符似乎在屏幕上。所以如果我写启用并点击删除它会变成启用但实际发送的是启用

我覆盖了 dispatchKeyEvent,它确实有效。如果选择了editText,终端现在通过串行删除字符,这是一个很好的步骤。然而,主要问题仍然存在,如果终端本身被选中,奇怪的小框会被写入屏幕而不是删除一个字符。写好了一个,如果我一直按删除它会停留在那个框,但是下次我输入我按下的删除量会显示为框。很奇怪……

就像它只是被编辑文本覆盖而不是终端。

奇特的小盒子尽显荣耀:

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 中的退格可以正常工作,我只是希望它在终端被突出显示并且我正在写的时候工作。

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

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

这发送了一个正确的退格,我只需要合并它。

但是软键盘似乎没有记录按键?我不断得到一个 0 的键码,只有输入才能工作。

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

【问题讨论】:

  • ooi,你试过'退格'键吗?
  • 你是什么意思?我正在按下退格/删除键。当我说删除时,我的意思是退格。
  • 啊,对了,对不起!正在考虑删除和退格是分开的全尺寸键盘配置
  • 啊对,没问题。仍然不知道该怎么做,糟糕的时光:D
  • 检查这个线程(特别是第二个响应):stackoverflow.com/questions/4886858/…

标签: java android serial-port


【解决方案1】:

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

【讨论】:

  • 嘿,如果我在此过程中意外开始删除内容,这是存储文本字段中内容的好方法,但我不确定我是否会摆脱最后一个字符。如果我点击删除并且终端突出显示,那么我只希望editText数据保持不变,我想要的是通过串行发送一个删除字符。当我突出显示它并退格时,editText 已经删除了一个字符。
【解决方案2】:

我建议当用户按下 Send 时捕获完整的字符串并一次性发送,就像聊天程序一样。

【讨论】:

  • 我想要,但我不知道该怎么做。该库设置为在每次按下时向write 类发送一个字符。我的其余代码就是这样,editText 发送一个字符串。我会调查的。
【解决方案3】:

看起来您正在使用的终端控件必须使用 KEYCODE_DEL 而不是让它传播到窗口,并且它必须向远程端发送不同的字符而不是 \b。因此,当您的编辑文本聚焦时,您的 dispatchKeyEvent 正在处理新闻 - 但是当终端有焦点时您看不到它。当终端有焦点时,您是否确认偶数处理程序正在通过调试器触发?您没有说终端使用的是哪个库,但我会看一下,看看您是否可以设置密钥处理程序或其他东西。

【讨论】:

  • 我会试试你说的谢谢,我使用的库是github.com/jackpal/Android-Terminal-Emulator这与我使用的usb-to-serial库是分开的,但是那个库没有问题。
  • 这是抛出我在上面github.com/jackpal/Android-Terminal-Emulator/blob/master/…上面发布的异常的类
  • 快速浏览一下代码,看起来 onKeyDown 和 onKeyUp 都返回 true,这会阻止事件传播。您可能可以在您的活动中使用 onKeyDown 做一些事情,但我对关键事件处理流程的记忆非常模糊,因此您必须对此进行研究。看起来 TermKeyListener 正在将 KEYCODE_BACK 映射到 "\177" (ascii delete no backspace 这就是 "\b" 是什么。看起来没有一种简单的方法来改变它。但也许你可以扩展和覆盖?跨度>
  • 我解决了这个谢谢,可以运行这些命令。 // ESC [ D (VT100 光标左) byte[] cmdLeft = { (byte) 27, (byte) '[', (byte) 'D' }; // ESC [ P (VT100 擦除光标处的字符) byte[] cmdErase = { (byte) 27, (byte) '[', (byte) 'P' };
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多