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);

    }

}


}

출처 -  http://blog.daum.net/stephenspoon/17

'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
Posted by 레미파
,