텍스트 입력 창이 있는 경우 soft input을 자동으로 띄워주는 것이 UX 측면에서 좋다. 그래서 대부분 iPhone이나 Android의 app들은 자동으로 soft input을 띄워준다.
Android에서 activity가 시작될 때 자동으로 soft input을 보여주는 방법은 http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft 에 잘 정리되어 있다.
그런데 여기 나온 방법으로 app을 만들어서 emulator에서 백날 돌려봐야 soft input이 나오지 않는다. 왜 그럴까? 이를 명확하게 설명해 놓은 공식 문서는 어디에도 없다.
그 이유는 http://groups.google.com/group/android-developers/browse_thread/thread/17210d784766602d?pli=1 의 대화내용들을 읽어보면 알 수 있다. 여기서 android framework engineer로 보이는 Dianne Hackborn이라는 사람이 다음과 같은 말을 하였다.
Typically the emulator runs as a device that has a keyboard, in which casethe system deliberately does not automatically show the IME because the user
has easy access to a real keyboard. It is recommended to not defeat this
behavior, resulting in an inconsistent behavior with the rest of the
applications.
그렇다. hardware keyboard가 있으면 manifest에 option을 아무리 줘도 soft input이 안 나올 수도 있다는 얘기다. 문서에는 이딴 설명 하나도 없다. android를 하면서 많이 느끼는 거지만 java가 정말 문서화 하나는 잘 했었구나라는 거다.
대화 내용들을 쭉 읽어 보면 알겠지만 보통 hardware keyboard는 접혀 있는 상태인데 그런 경우는 당연히 soft input을 보여줘야 하는 거 아니냐고 따지는 사람도 있다. 내가 봐도 그렇다.
뭐 하여튼 이 option이 제대로 동작하는지 확인하려면 emulator를 만들 때 hardware keyboard를 지원하지 않는 것으로 profile을 만들어야 한다. 그럼 잘 된다.
그런데, 난! 장비에 hardware keyboard가 있든 없든 자동으로 soft input을 보여주고 싶단 말이다! 보통 hardware keyboard가 사용 가능 상태로 되어 있으면 soft input을 띄워달라고 해도 시스템에서 알아서 안 띄운다. 고로 activity 시작할 때 강제로 soft input을 띄워달라고 코드를 넣어야 한다.
InputMethodManager manager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
manager.showSoftInput(findViewById(R.id.text), 0);
onCreate에 위 코드를 넣고 실행해 보자. soft input이 뜰까? 안뜰까? 안뜬다. 오 지쟈스!!! 왜 안뜰까? 안타깝게도 onCreate 시점에는 activity를 만들고 있는 상황이라 이런 요청을 가볍게 씹어주신다. 어차피 activity가 화면에 보여지는 최초의 순간은 life cycle 상 onCreate -> onStart -> onResume 이 모두 끝나야 한다. (물론 저 life cycle 중간 중간에 잡다구리한 phase들이 더 있다) 고로 onResume에 나 조금 있다가 이것좀 해달라고 요청을 넣어야 한다.
@Override
protected void onResume() {
super.onResume();
final View view = findViewById(R.id.text);
view.postDelayed(new Runnable() {
public void run() {
InputMethodManager manager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
manager.showSoftInput(view, 0);
}
}, 100);
'안드로이드' 카테고리의 다른 글
hardware keyboard의 존재 여부 및 상태 확인 (0) | 2011.01.27 |
---|---|
안드로이드 개발 팁 (0) | 2011.01.27 |
Android Emulator의 성능을 빠르게 하기 (0) | 2011.01.27 |
ANR 발생 원인 (0) | 2011.01.27 |
안드로이드에서 마우스 이벤트 처리하기 (0) | 2011.01.27 |