2011-03-23 5 views
4

여러 가지 유사한 질문에 대한 대답을 읽은 후 * onKeyListener()가 소프트 (가상) 키보드에서 키 누르기 이벤트를받지 못한다는 것을 알고있었습니다. 하드 (물리적) 키보드에서만 가져옵니다. 그리고 해결 방법은 TextWatcher 또는 onKeyboardActionListener를 사용하는 것입니다. 나는 다음과 같은 질문을 가지고있다 :Android - 가상 및 실제 키보드 이벤트 처리

(1) 하나의 청취자 만 구현하여 어떤 키보드에서든 (자연스럽게 또는 단단한) 키 누름을들을 수있는 방법이 있습니까? 또는 기본적으로 둘 다 작동하는 단일 API?

(2) onKeyListener()의 onKey() 메서드와 달리 TextWatcher 또는 onKeyboardActionListener는 현재 포커스가있는 (사용자가 입력을 입력하는) 뷰를 전달하지 마십시오. 그렇다면 TextWatcher 또는 onKeyboardActionListener를 사용하려면 현재 포커스 된 뷰를 얻으려면 어떻게해야합니까? 입력에 따라 사용자가 입력 내용을 입력하는 EditText에서 일부 속성을 설정할 수 있어야합니다.

* 관련 질문 : onKeyListener not working on virtual keyboard, onKeyListener not working with soft keyboard (Android), Android: why is my OnKeyListener() not called?

감사합니다!

답변

1

동일한 문제가 있습니다. 그리고 소프트 키보드 이벤트 처리를위한 하나의 솔루션을 구현하는 좋은 방법이 없다고 가정 해보십시오. delete 이벤트의 경우 onKeyListener()을 구현하고 키 이벤트의 경우 TextWatcher를 구현했습니다.

m_edtRecipients.addTextChangedListener(new TextWatcher() { 
     boolean bConsumed = false; 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (!bConsumed) { 
       RecipientsTextStyle.format(m_edtRecipients.getText(), m_dbProcessor); 
      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      if (count != 0) { 
       bConsumed = true; 
       Log.d(TAG, "delete true"); 
      } else { 
       bConsumed = false; 
       Log.d(TAG, "erase false"); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

TextWatcher 접근 방식과 하나의 큰 단점이있다 - 당신은 당신의 글고 치기가 연결되어 편집 변경할 수 없습니다 - 그것은 루프의 원인이됩니다. 조심해!