티스토리 뷰
EditText없이 View에서 소프트키보드 입력 받기
1. 개요
뷰에 KeyListener나 BaseInputConnection 등록을 통해 소프트키보드에 입력한 문자를 얻어낼 수 있습니다. 하지만 대부분의 예제가 영어를 대상으로 하여 한글과 같은 글자는 최종적으로 한 글자가 완성 되었을 경우에만 commitText를 통해 얻어낼 수 있는 예제밖에 없더군요.
즉, '학교'를 입력하게 되면 'ㅎㅏㄱㄱ'를 입력해야 '학' 이라는 글자가 리포팅 되는 형태입니다.
제가 원하는 것은 입력했을 때, 바로바로 키 이벤트를 받기를 원했는데 안되더군요.
답은 아주 간단한 곳에 있었습니다. 그건 바로 InputConnection::setComposingText() 였습니다. 한글과 같이 조합중인 텍스트를 입력받을 때마다 바로바로 알려주더군요.
이 녀석을 찾기 위해 EditText, TextView, InputMethodManager, InputConnection, BaseInputConnection 등 안드로이드 코어 코드를 3일 내내 쳐다보고 있었네요. 그냥 간단히 함수만 보고 작업했으면 금방 찾았을 건데, 예제에 의존하다 보니 발생된 제 실수인거죠.
누군가가 저와 비슷한 짓(?)을 통해 시간 낭비 하실거 같아 작업 코드를 그대로 올립니다.
2. 소스
public class WordComposer extends View {
private EditableInputConnection mEii;
public WordComposer(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusableInTouchMode(true);
setFocusable(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_UP) {
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this, InputMethodManager.SHOW_FORCED);
}
return true;
}
@Override
public boolean onCheckIsTextEditor() {
return true;
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
outAttrs.actionLabel = null;
outAttrs.label = "Composer Test";
outAttrs.inputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE;
if (mEii == null) mEii = new EditableInputConnection(this);
return mEii;
}
public class EditableInputConnection extends BaseInputConnection {
private final View mView;
private SpannableStringBuilder mEditable;
String mText = new String();
public EditableInputConnection(View textview) {
super(textview, true);
mView = textview;
mEditable = (SpannableStringBuilder) Editable.Factory.getInstance().newEditable("composer");
}
public Editable getEditable() {
return mEditable;
}
/*이곳을 통해 영문입력을 전달 받으세요. for English*/
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
return super.commitText(text, newCursorPosition);
} /*이곳을 통해 한글 입력을 바로바로 전달 받으세요. for Multibyte code*/
@Override
public boolean setComposingText(CharSequence text, int newCursorPosition) {
return super.setComposingText(text, newCursorPosition);
}
}
}
'Computer > Android' 카테고리의 다른 글
[Android] SurfaceView xml 에 추가하고 배경 투명 (0) | 2020.02.18 |
---|---|
[Android] SurfaceView 기본 (0) | 2020.02.18 |
[Android] 나인패치 비트맵 만들기 (0) | 2019.10.06 |
Debug keystore SHA-1 value check (0) | 2019.09.30 |
[EditText] Password 숨기기 (0) | 2019.09.30 |
댓글