
개발중인 노트 앱에 마크다운 기능을 넣기 위해 EditText에서 사용자의 Enter와 Delete키 입력을 캐치해야 했습니다... 처음에 TextWatcher를 이용해서 알아내려 했지만 실패...T^T 그 이유는 소프트키보드에서 사용자가 키를 계속해서 입력하고 있는 상황에 주어진 정보(count, before, after, start)로는 불가능했습니다. 그래서 onKeyEvent 함수를 오버라이딩하는 방법도 생각해 봤지만 onKeyEvent는 Soft Keyboard에서 먹통이라는 점... 그래서 열심히 구글링 하던 중에 InputConnection을 활용하여 KeyEvent를 캐치하는 방법을 알게 됐습니다.
간단한 사용 예제를 통해 기억해둡시다!
class MyEditText : AppCompatEditText {
constructor(context: Context) : super(context) {
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
}
override fun onCreateInputConnection(outAttrs: EditorInfo?): InputConnection {
return object : InputConnectionWrapper(super.onCreateInputConnection(outAttrs), true){
override fun sendKeyEvent(event: KeyEvent?): Boolean {
if(event?.action == KeyEvent.ACTION_DOWN){
when(event.keyCode){
KeyEvent.KEYCODE_DEL->{
//catch delete key
}
KeyEvent.KEYCODE_ENTER->{
//catch enter key
}
}
}
return super.sendKeyEvent(event)
}
}
}
}
EditText를 상속해서 커스텀 EditText를 만들고 커스텀 EditText에서 onCreateInputConnection을 오버라이딩하면 끝입니다!