我使用android中的库连接到终端模拟器,它连接到串行设备(交换机)并显示发送/接收的数据。我通过终端下方的文本框通过连接发送数据,或者通过键入终端本身并在两种情况下按键盘输入。它只会是一个使用的软键盘。如果我发送的字符串不正确,我处于不可恢复状态,因此我必须提供删除密钥实现。
这没关系,如果我选择终端我可以删除数据。但是,如果我选择editText则存在问题。如果我按删除,则删除一个字符,但终端上似乎有两个字符。因此,如果我写“启用”并点击删除它将在终端屏幕上更改为“enab”,但实际发送的是“enabl”。所以我需要做的是弄清楚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中按下delete并且它为空时会发生这种情况。如果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);
};
答案 0 :(得分: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);
};
答案 1 :(得分:1)
txtEdit.setOnTouchListener(new View.OnTouchListener(){
public boolean onTouch(View view, MotionEvent motionEvent) {
// your code hope it helps you :)
return false;
}
});
答案 2 :(得分:0)
首先,删除了2个字符,因为dispatchKeyEvent
将被触发两次,一次使用KeyEvent.ACTION_DOWN
(首次按下时),然后再次使用KeyEvent.ACTION_UP
(当按钮被释放)。
因此,您还需要对ACTION_UP
:
if( event.getKeyCode() == KeyEvent.KEYCODE_DEL
&& KeyEvent.getAction()==KeyEvent.ACTION_UP )
所以这就是造成问题的原因。要在标题中回答您的问题,您可以检查EditText
是否具有以下焦点:myEditText.hasFocus()
。