如何判断editText是否在焦点?

时间:2013-01-24 11:59:04

标签: java android focus

我使用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);
};

3 个答案:

答案 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()