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);
}
}
'Programming > Android' 카테고리의 다른 글
안드로이드 Mime-Type (1) | 2011.12.19 |
---|---|
Wifi <-> 3G의 상태변환 (1) | 2011.11.14 |
GestureDetector (1) | 2011.08.29 |
안드로이드 Shell 명령어 및 소스에서 Shell 실행 방법 (0) | 2011.07.07 |
안드로이드 색상표 (0) | 2011.07.04 |