2016-07-07 3 views
0

일종의 터미널 에뮬레이션을 사용하려면 키 누르기를 들어야합니다. 따라서 나는 EditText이 없습니다. 하지만 성공적으로 여기Enter 키를 쿼리하는 것이 Android 소프트 키보드에서 작동하지 않습니다.

public class Click implements View.OnClickListener 
    { 
    @Override 
    public void onClick (View view) 
     { 
     CursorText terminal = (CursorText) findViewById (R.id.term_window); 
     InputMethodManager manager; 
     manager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); 
     manager.showSoftInput (terminal, InputMethodManager.SHOW_FORCED); 
     } 
    } 

에 의해 변수 terminal을 소프트 키보드를 생성 TextView에서 파생 된 사용자 정의 클래스 CursorText의 인스턴스입니다. 클릭 수를 허용하도록 속성은 android:textIsSelectable="true"입니다. 그렇지 않으면 android:imeOptions="flagNoExtractUi|flagForceAscii"이 있지만 이것들은 아무런 해를 끼치 지 않는 것 같습니다.

내 문제는 이제 키 입력을 받고 있습니다. API 문서를 조사해 보면 신뢰할만한 방법이없는 것처럼 보입니다. 관련 문서에서 설명한 클래스와 메서드는 하드웨어 키보드에서만 작동합니다. 그러나 방법이 있어야합니다.

onKeyListener, onKeyPreIme 등 많은 접근 방식을 시도했지만 대부분 반응하지 않습니다. 예를 들어 onKeyPreImeView에서 파생 된 클래스에서 재정의해야합니다. 제 경우에는 확실한 선택 인 클래스 terminal이 인스턴스입니다. EditText이 아니기 때문에 onKeyPreIme이 호출되지 않을 수도 있습니다. 나는 같은 이유로 내 경우에 나는 TextWatcher을 사용할 수 없다고 생각한다.

지금까지의 최상의 결과는 활동에서 onKeyDown을 무시한 것입니다. 이 메소드는 Backspace를 포함하여 거의 모든 키에 호출됩니다. 단 하나의 가장 중요한 키인 Enter (Return) 키가 예외입니다. 나는 다른 리스너 메소드가 나의 것보다 먼저 호출되고 처리하지만, 키 이벤트를 전달하지 않는다는 느낌이 들었다. 나는 알아낼 방법을 모르지만.

다른 문제는 onKeyDown입니다. 키를 길게 누르면 자동 반복이 생성되지 않습니다. KeyEvent.ACTION_DOWN만을보고하는 것 같지만 KeyEvent.ACTION_UP이 아니기 때문에 자동 반복을 직접 만들 수 없습니다.

나는 자동 반복없이 살 수 있다고 생각하지만 Enter 키가없는 것이 쇼 스토퍼입니다. 그렇다면 Enter 키 이벤트의 잠금을 해제하려면 어떻게해야합니까? Enter 키를 누를 때 onKeyDown이 호출되지 않도록하려면 어떻게해야합니까? 또는 키 스트로크를 듣는 전혀 다른 방식으로해야합니까?

BTW. Lollipop과 Kitkat, 실제 하드웨어의 CM과 에뮬레이터의 빈티지 -G Android - Jelly Bean 이상을 지원하려고 시도하고 있습니다.

답변

0

SOFT 키 보드는 거의 키 이벤트를 생성하지 않습니다. 일반적으로 한 번에 전체 문자열을 가져 오는 inputConnection.commitText를 호출하여 작동합니다. 원하는 것을하기 위해 InputMethod를 뷰에 연결하고 뷰의 onCreateInputConnection을 재정 의하여 commitText를 제대로 처리 할 수있는 사용자 지정 InputConnection을 반환해야합니다.

관련 문제