[안드로이드] TextView의 ImeOptions에 관한 짧은 생각

이상빈·2021년 12월 16일
0

키보드 어플을 개발하면서, 일부 텍스트에서 엔터 버튼이 먹통이 되는 현상이 발생하였다.

내 키보드의 엔터 버튼은 EditText의 속성에서 imeOption값이 무엇인지에 따라 그 역할이 달라지기 때문에, 이에 대한 예외처리를 해줘야만 한다.

그런데 조사 결과, 일부 어플들의 텍스트뷰(에딧텍스트)의 ImeOption 속성이 기존의 문서와 일치하지 않는 걸 로그를 통해 알 수 있었다.

위 목록이 공식문서에서 설명하는 ImeOptions 값들이다.
예를 들면 IME_ACTION_SEARCH 같은 경우, int 값으로 3를 배정받았다.

그런데 카카오톡 메시지입력창의 "# 검색" 과 같은 경우에는, imeOption 값이 134217731이다.

이런 경우, 키보드의 엔터 버튼에 imeOption버튼대로 명령을 수행하라고 해도 전달이 되지 않는다.

무슨 뜻이냐면, EditText를 구성한 개발자는 이 EditText가 검색창의 용도로 활용되길 바라지만, 키보드는 그게 검색창인지 아닌지 모르기 때문에 키보드의 엔터 버튼이 제 역할을 수행하지 못하는 것이다.

그렇기 때문에, 근본적으로 imeOption값이 왜 저런 이상한 값이 되었는지를 알아낼 필요가 있다.

우선 ImeOption 목록의 상수값을 모조리 조사해봤더니, 눈에 띄는 점이 하나가 있었다.

IME_FLAG_NAVIGATE_NEXT 의 값은 바로 134217728이라는 점이다.

IME_ACTION_SEARCH(=3)과 IME_FLAG_NAVIGATE_NEXT(=134217728)을 더하면 134217731이 된다.

그럼 위 imeOption 목록의 값들을 서로 조합하여 더하면 새로운 imeOption 값이 된다는 뜻인가?

일단 확신은 할 수 없지만 대충 이런 느낌인 거 같다.

새로 알아낸 사항

  1. 카카오톡의 imeOptions 값은 1375731718 이다. 이를 16진수로 환산하면 *0x52000006이 나온다.

    여기서 제일 마지막 자리인 6에 주목하자.

    6에 해당하는 imeOptions 값은 IME_ACTION_DONE이다.

  2. 일반적인 핸드폰 기본 메시지어플의 imeOptions값은 0x50000004이다.
    여기서 제일 마지막 자리인 4에 해당하는 imeOptions값은 IME_ACTION_SEND이다.
    공식 문서의 IME_ACTION_SEND의 설명을 살펴보면, 다음과 같다.

    This is typically used when composing a message in IM or SMS where sending is immediate.

위 두 가지 케이스를 포함하여 여러 경우를 살펴봤을 때, 각 EditText의 imeOptions를 16진수로 변환했을 때, 첫번째 자리의 숫자에 의해 Enter키의 기능이 결정된다고 추측해볼 수 있다.

profile
발전을 좋아하는 사람

0개의 댓글