2017-10-17 2 views
0

일련의 주요 이벤트를 시뮬레이트하고 싶습니다. 조금 시간을 들여 검색 한 결과, BaseInputConnection 유형의 객체가 sendkeyEvent 발견되었습니다. 그래서 onCreate() 함수의 MainActivity 클래스에서, 나는이 활동에 묶는 textview에 keyevent를 세 번 보낸다.onKey in activity가 호출되지 않았습니다.

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    ... 
    TextView tv = (TextView) findViewById(R.id.sample_text); 
    tv.setText(stringFromJNI); 
    tv.setOnKeyListener(this); 

    BaseInputConnection mInputConnection = new BaseInputConnection(tv, true); 
    //BaseInputConnection mInputConnection = new BaseInputConnection(tv, false); 
    KeyEvent kleft = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT); 
    for(int i=0;i<3;i++){ 
    mInputConnection.sendKeyEvent(kleft); 
    Log.d(TAG, "keyevent sent"); 
    } 
} 

MainActivity 클래스는 인터페이스 OnKeyListener를 구현합니다.

@Override 
public boolean OnKey(View v, int keyCode, KeyEvent){ 
    Log.d(TAG, "OnKey starts."); 
    if(event.getKeyCode()==KeyEvent.KEYCODE_DPAD_LEFT && event.getAction()==KeyEvent.ACTION_DOWN){ 
    Log.d(TAG, "key left."); 
    return true; 
    } 
    return false; 
} 

logcat의 출력을 확인한 후 "keyevent sent"가 printend가 세 번 인쇄 된 것을 알 수 있습니다. 이는 keyevents가 전송되었음을 의미합니다. 그러나 "OnKey starts"은 없었습니다. 왜 OnKey() 함수가 호출되지 않았습니까?

답변

0

¿이 방법을 사용해 볼 수 있습니까? "하드웨어 키보드에서만 작동 OnKeyListener 나

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
switch (keyCode) { 
case KeyEvent.KEYCODE_MENU: 
    /* Sample for handling the Menu button globally */ 
    return true; 
} 
return false; 
} 
0

에 대한 onKeyDown에 작품.

https://developer.android.com/reference/android/view/View.OnKeyListener.html

대신 텍스트 뷰의 텍스트 변경 TextWatchListener를 사용하여이 링크

을 확인합니다.

tv.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 
    }); 
+0

"OnKeyListener는 하드웨어 키보드에서만 작동합니다"라는 점을 알려 주셔서 감사합니다. 그 이유는 내 OnKey 함수가 호출되지 않은 이유입니다. 그러나 나는 실제 키보드 또는 소프트 키보드에서 생성되지 않은 ** 가상 키 이벤트 **를 다루는 활동 (또는보기 또는 일부 서비스)을 원합니다. – dudu

+0

텍스트 워처조차도 당신의 문제를 해결할 것입니다. – Anonymous

0

시도해보십시오 onKey()

@Override 
      public boolean dispatchKeyEvent(KeyEvent event) { 
       if(event.getKeyCode()==KeyEvent.KEYCODE_DPAD_LEFT && event.getAction()==KeyEvent.ACTION_DOWN){ 
        Log.d(TAG, "key left."); 
        return true; 
       } 
       return super.dispatchKeyEvent(event); 
      } 
+0

시도했지만 실패했습니다. 한 가지 내가 궁금한 점은 텍스트 뷰와 활동 간의 관계는 무엇입니까? 함수'sendKeyEvent'를 사용하면 keyevent는 뷰에만 보낼 수 있습니다. 그렇다면 활동의 'dispatchKeyEvent'가 이벤트를 직접 처리하는 이유는 무엇입니까? 나는 이것이 안드로이드 사건 파견 전략과 관련이 있다고 생각하지만, 나는 완전히 이해하지 못한다. – dudu

+0

다음 링크에서 일부 정보를 얻을 수 있습니다. https://stackoverflow.com/questions/7846050/difference-between-onkey-onkeydown-and-dispatchkeyevent-methods-provided –

관련 문제