티스토리 뷰

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

 

 



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

댓글

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음



Total
Today
Yesterday
최근에 달린 댓글