3

我正在使用 android 中的库连接到终端仿真器,它连接到串行设备(开关)并显示发送/接收的数据。我通过终端下方的文本框或在终端本身输入并在两种情况下都按键盘上的 Enter 键通过连接发送数据。它只会是使用的软键盘。如果我发送了一个不正确的字符串,我就处于不可恢复的状态,所以我必须提供一个删除键实现。

这工作正常,如果我选择终端,我可以删除数据。但是,如果我选择 editText 就会出现问题。如果我按删除,则删除一个字符,但终端上似乎有两个字符。因此,如果我写“启用”并点击删除,它将在终端屏幕上更改为“启用”,但实际发送的是“启用”。所以我需要做的是弄清楚editText何时成为焦点,如果不是运行这些行

  mSession.appendToEmulator(cmdLeft, 0, cmdLeft.length);
  mSession.appendToEmulator(cmdErase, 0, cmdErase.length);

我已经合并了这个:http: //developer.android.com/reference/android/view/View.OnFocusChangeListener.html

唯一的问题是,如果我将焦点从 editText 更改为终端,它有时会删除一个字符,我需要它实际等待按下删除键。它不会一直发生,但它似乎陷入某种状态,它总是认为键码已被删除,并且每次我在焦点之间切换时都会发生删除。我应该在运行后重置键码还是什么?为什么认为键码被删除会卡住?即使在我按下回车等之后。当我在editText中按删除并且它是空的时会发生它。如果 editText 为空,并且终端中有数据,它会正确删除该数据但会触发此错误。此外,如果 editText 中没有任何内容且终端中没有任何内容,则不会删除任何内容,但会触发错误。

public boolean dispatchKeyEvent(KeyEvent event) {
    if (event != null && event.getAction() == KeyEvent.ACTION_UP) {

        return false;
    }
if(event.getKeyCode() == KeyEvent.KEYCODE_DEL){

    mEntry.setOnFocusChangeListener(new OnFocusChangeListener(){
        @Override
        public void onFocusChange(View v,boolean hasFocus){

              if (!hasFocus) {
                    mSession.appendToEmulator(cmdLeft, 0, cmdLeft.length);
                    mSession.appendToEmulator(cmdErase, 0, cmdErase.length);
                    Log.d(TAG, "in inner delete");
              }
        }          
    });

    Log.d(TAG, "in delete in delete in delete in delete");
    try {
        sendOverSerial("\b".getBytes("UTF-8"));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
    return super.dispatchKeyEvent(event);
};
4

3 回答 3

1

这个小技巧似乎有效,但我真的很想知道它为什么会发生/更好的解决方案。

    public boolean dispatchKeyEvent(KeyEvent event) {
    if (event == null || event.getAction() == KeyEvent.ACTION_UP) {

        return false;
    }
   if(event.getKeyCode() == KeyEvent.KEYCODE_DEL){

    mEntry.setOnFocusChangeListener(new OnFocusChangeListener(){

        public void onFocusChange(View v,boolean hasFocus){

              if (!hasFocus && !mEntry.getText().toString().trim().equals("")) {

                    mSession.appendToEmulator(cmdLeft, 0, cmdLeft.length);
                    mSession.appendToEmulator(cmdErase, 0, cmdErase.length);

              }
              else 
              {
                    mEntry.setText(" ");
              }
        }          
    });

    try {
        sendOverSerial("\b".getBytes("UTF-8"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

    return super.dispatchKeyEvent(event);
};
于 2013-01-24T14:50:54.170 回答
1
txtEdit.setOnTouchListener(new View.OnTouchListener(){
    public boolean onTouch(View view, MotionEvent motionEvent) {                                                       
         // your code    hope it helps you :)     
         return false;
    }
});
于 2015-06-02T03:37:12.877 回答
0

首先,删除 2 个字符,因为dispatchKeyEvent会触发两次,一次 with KeyEvent.ACTION_DOWN(第一次按下时),然后再次 with KeyEvent.ACTION_UP(释放按钮时)。

因此,您还需要执行以下检查ACTION_UP

if( event.getKeyCode() == KeyEvent.KEYCODE_DEL 
    && KeyEvent.getAction()==KeyEvent.ACTION_UP )

所以这就是导致你的问题的原因。要在标题中回答您的问题,您可以检查 anEditText是否有这样的焦点:myEditText.hasFocus()

于 2013-01-24T12:54:26.393 回答