2013-01-24 136 views
3

我正在使用Android中的库连接到终端仿真器,它连接到串行设备(交换机)并显示我发送/接收的数据。我通过终端下方的文本框发送数据,或者在两种情况下输入终端本身并敲击键盘上的回车。它只会是一个使用的软键盘。如果我发送不正确的字符串,我处于不可恢复的状态,所以我必须提供删除密钥实现。如何判断editText是否在焦点?

这工作正常,如果我选择终端,我可以删除数据。但是,如果我选择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); 
}; 

回答

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

首先,2个字符与KeyEvent.ACTION_DOWNKeyEvent.ACTION_UP(当按钮被释放)删除,因为dispatchKeyEvent将被触发两次,一次(当第一次按下它),然后再次。

所以,你还需要进行检查ACTION_UP

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

因此,这是什么原因导致你的问题。要在标题中回答您的问题,您可以检查EditText是否有如下焦点:myEditText.hasFocus()

+0

感谢。我很困惑,我是否已经检查过action_up并返回false。当我选择editText时会删除两个字符,因为我通过串行发送了'\ b',并将它返回到屏幕它将删除一个字符,然后我发送'appendToTerminal'命令,从屏幕上删除另一个字符。如果我实现了你的方法,那么当选择编辑文本时,终端上不会删除任何内容。但它似乎停止了焦点更改时的删除。 – Paul

+0

啊我看到了,你的答案不起作用,因为我已经检测到钥匙是否起作用并返回假。所以,这不是问题,我很害怕:( – Paul

+0

我找不到hasFocus除了当我使用它,就像我现在在听众。 – Paul

1
txtEdit.setOnTouchListener(new View.OnTouchListener(){ 
    public boolean onTouch(View view, MotionEvent motionEvent) {              
     // your code hope it helps you :)  
     return false; 
    } 
}); 
相关问题