2009-12-28 4 views
16

onKeyListener를 사용하여 onKey 이벤트를 가져옵니다. 그것은 정상적인 키보드로 잘 작동합니다. 하지만 소프트 키보드에서는 작동하지 않습니다. 난 숫자가 아니라 알파벳에 대한 onKey 이벤트를 얻을 수 있습니다. 이 문제를 해결할 수있는 해결 방법이 있습니까? 어떤 종류의 도움이라도 대단히 감사하겠습니다.onKeyListener가 소프트 키보드와 작동하지 않습니다 (Android)

+0

그것은 이상한 소리가 난다. 청취자의 코드를 어디에 게시 할 수 있습니까? –

+0

public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.login_screen); emailTxt = (EditText) findViewById (R.id.email); emailTxt.setOnKeyListener (새 OnKeyListener() \t { \t \t 공공 부울 onKey (보기 V, INT 키 코드, KeyEvent를 이벤트) \t \t { \t \t \t Log.i ("키 값", 문자열. valueOf (keyCode)); \t \t}); } –

+0

지금은 키를 읽는 중입니다. –

답변

10

소프트웨어 키보드로 OnKeyListener가 전혀 호출되지 않는다고 생각합니다. IME 장치 인 소프트웨어 키보드와 키보드 이외의 IME 장치와 관련이 있습니다. onKeyListener는 하드웨어 키보드가있는 전화기에서만 작동하기 때문에 꽤 쓸모가없는 것처럼 보입니다. 최근에 OnKeyListener를 사용하는 대신 내 Activity의 EditText 필드에 TextWatcher을 사용하여이 문제를 해결했습니다.

+0

TextWatcher를 사용했지만 각 키를 눌렀을 때 KeyUp 및 KeyDown 이벤트가 필요했습니다. Textwatcher는 나에게 keydown 이벤트를 제공합니다. –

+0

소프트웨어 키보드에서 KeyUp 및 KeyDown을들을 수 있다고 생각하지 않습니다. –

7

onKeyListener는 안드로이드 1.6에서

는 이후 문자와 숫자 키를 onKey 이벤트를 통해하지 않을 소프트 키보드를 통해 안드로이드 1.5에서 완벽하게 작동, 아직 DEL 키를

좌절

3

이 작업을 수행 장치에 특정 된 것 같습니다. 나는 이것이 Xoom과 Acer A100에서 작동한다는 것을 확인할 수 있습니다. 그러나 Samsung Galaxy Tab Plus는 문자가 아닌 버튼에 대해서만 이벤트를 실행합니다. (Honeycomb을 실행하는 모든 장치)

1

나는 청취자를 자신의 방법으로두고 처음으로 다시 호출하여이 문제를 해결했습니다. onCreate에서 나는 setKeyListenerForEnter()를 호출한다.

그런 다음, 여기에 방법이다 :이이 IME 키보드 자체를 처리하는 것보다 더 나은 솔루션이 있는지 확실하지 않습니다

공공 무효 setKeyListenerForEnter() {

final EditText search_entry = (EditText) findViewById(R.id.search_entry); 
    search_entry.setOnKeyListener(new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      // If the event is a key-down event on the "enter" button 
      if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
       (keyCode == KeyEvent.KEYCODE_ENTER)) { 
       getSearchResults(v); 
       setKeyListenerForEnter(); 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

하지만 솔루션입니다 .

4

어쩌면 어리석은 일일 수도 있지만, 지금은 Android가 작동하는 방식입니다.

설명서에는 소프트웨어가 아닌 하드웨어 키 스트로크에 대해서만 키 이벤트가 전파된다고 나와 있습니다.

장치 제조업체는 실제 제품을 존중하거나 동등한 조건으로 소프트 키보드와 하드 키보드를 실제로 처리하기는하지만 제조사에게 완전히 의존하지만 키 수신기를 통해 소프트 키보드 이벤트를 전달하는 것을 실제로 권장하지 않습니다.

안드로이드 4.2.2부터 안드로이드 시스템 자체는 소프트 키보드의 키 스트로크 이벤트를 지원하지 않으므로 제조업체조차도 자신의 방식을 선택할 수 없습니다.

유일한 실수 방지 옵션은 사용자의 IME (소프트 키보드)를 구현하고 키 입력을 직접 처리하는 것입니다.

TextWatcher는 대부분 키 수신기를 대체하는 데 사용할 수 있지만 editText.setText (...); 또한 TextWatcher 이벤트를 트리거하므로, 입력 된 키에만 관심이 있다면 아마도 TextWatcher도 해결책이 될 수 없습니다.

TextWatcher를 AutocomleteTextView 또는 EditText와 함께 사용할 때는주의하십시오. TextWatcher 이벤트 내에서 AutocompleteTextView/EditText 컨텐트의 텍스트를 수정하지 마십시오. 그렇지 않으면 무한 이벤트/수신 루프로 끝날 것입니다.

희망 사항은 사용 가능한 옵션을 명확히하는 데 도움이 되겠지만 슬프게도 작동하는 솔루션을 제공하지 않습니다.

Google이 UI의 중요한 측면에서 실망했다고 실망스럽게 생각합니다.

-1
setFocusableInTouchMode(true); //Enable soft keyboard on touch for target view 

setFocusable(true); //Enable hard keyboard to target view 

예 : 소프트 키보드에서 일부 문자가 아닌 다른 사람을 얻고있는 경우

public class CanvasView extends View{ 
    public CanvasView(Context c){ 
     super(c); 

     //enable keyboard 
     setOnKeyListener(new KeyBoard()); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 
    } 
} 
+0

이 코드를 사용하는 방법에 대한 예제를 제공해 주시겠습니까? 나는 지금 그것을 시도하고 그것은 작동하지 않는 것. – Simon

+0

공용 클래스 CanvasView보기를 확장 { \t \t 공공 CanvasView (컨텍스트 C) { \t \t 슈퍼 (C); \t \t \t \t // 키보드 수 \t \t setOnKeyListener (새 키보드()); \t \t setFocusable (true); \t \t setFocusableInTouchMode (true); \t}} // 키보드를 canvasView로 설정합니다. – user3309567

관련 문제