본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] soft keyboard control ( show & hide )

by 돼지왕 왕돼지 2012. 10. 19.
반응형





soft keyboard control ( show & hide )

- 프로그램을 하다 보면 soft keyboard ( 정확히 말하면 software keyboard 로 물리적인 키보드가 아닌 화면에 나오는 가상의 키보드 ) 를 control 할 일들이 있습니다. 이는 InputMethodManager 를 통해서 control이 가능한데요, API 에서는 지원은 하지만 method 들이 제대로 작동하지 않는 경우를 맞딱뜨리게 됩니다. 예를 들면 hideSoftInputFromWindow와 showSoftInputFromWindow 가 제대로 작동하지 않는 경우가 생기죠. 암만 둘을 호출해도 전혀 미동이 없는 경우가 다반사입니다. 왜 그럴까요?


hideSoftInputFromWindow 와 showSoftInputFromWindow 가 제대로 작동하지 않는 이유.

Activity 가 뜨면서 & EditText 를 touch 함으로써 system 이 자동으로 soft keyboard 를 띄운 경우에는 toggleSoftInput 함수로만 soft keyboard 를 컨트롤을 할 수 있습니다. 사실 그 soft keyboard 는 해당 edittext 의 token을 가지고 띄운 것이 아니기 때문이지요.




그럼 어쩌란 말이요?

그래서 edittext 의 softkeyboard 를 control 하려면, show 자체를 InputMethodManager 를 통해 호출하여야, hide 역시 InputMethodManager를 통해 control 가능합니다. 이 때 같은 window token 을 사용해야 합니다.


위에서 언급한 것과 같이 EditText를 터치했을 때도 Soft keyboard 가 자동으로 뜨는데 이 역시도 EditText의 Window Token 이 이용되지 않고 System 을 통해 keyboard 를 띄우기 때문에 Touch 를 통해 나온 Keyboard 는 InputMethodManager 로 감추기가 어렵습니다. ( toggle 로 가능하긴 하지만.. ) 따라서 터치 시 자동으로 soft keyboard를 띄우는 현상을 막고, 프로그램적으로 직접 띄우고 마찬가지로 프로그램적으로 직접 하이드를 해야 합니다. 이는 간단히 EditText에 OnTouchListener 를 set 함으로서 가능한다.




말만 말고 코드를 보여달라. OK!!

editText.setOnTouchListener( new OnTouchListener() {

   @Override

   public boolean onTouch(View v, MotionEvent event) {

      showSoftkeyboard();  // 프로그램적으로 keyboard 를 띄운다.

      return true; // true 를 전달함으로서 시스템이 keyboard 를 띄우지 못하게 한다.

   }

});

private void showSoftkeyboard(){

   InputMethodManager imm = (InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE );

   imm.showSoftInput( editText, 0 );

}
 

private void hideSoftKeyboard(){

   InputMethodManager imm = (InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE );

   imm.hideSoftInputFromWindow( editText.getWindowToken(), 0 );









반응형

댓글