본문 바로가기
Android

[깡샘의 안드로이드 프로그래밍] 정리 17 - 키보드 제어

by 들풀민들레 2018. 1. 5.

 

 

본 글은 [깡샘의 안드로이드 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

 

 

 

 

15장. 액티비티 생명주기 및 다양한 제어

 

15.3.1. 키보드 제어

 

 

키보드 보이기와 숨김

 

안드로이드 폰에서 제공하는 키보드는 크게 하드웨어 키보드와 소프트 키보드로 구분됩니다. 

하드웨어 키보드는 스마트폰에서 물리적으로 제공하는 키보드로 우리의 앱에서 창을 제어하는 것과 관련이 기능을 제공하는 클래스가 InputMethodManager입니다.

 

InputMethodManager manager=(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);

 

InputMethodManager 클래스에서 제공하는 showSoftInput ( ) 함수를 이용해 키보드를 보이고, hideSoftInputFromWindow( ) 함수로 숨깁니다.

 

  • showSoftInput(View view, int flags): 키보드 보임
  • hideSoftInputFromWindow(IBinder windowToken, int flags): 키보드 숨김

 

if(v==hideBtn){

manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),

InputMethodManager.HIDE_NOT_ALWAYS);

}else if(v==showBtn) {

manager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

}

 

주의할 점은 showSoftInput ( ) 함수의 첫 번째 매개변수로 글이 입력될 뷰를 지칭하는데, 입력 대상이 되는 뷰에 포커스가 없는 상태라면 키보드가 나타나지 않습니다. 

이처럼 현재 포커스가 없는 EditText에 입력되게 키보드를 보이려면 requestFocus ( ) 함수를 이용하여 포커스를 요청한 후 showSoftInput( ) 함수로 키보드가 나타나게 하면 됩니다.

 

editText.requestFocus();

manager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

 

코드에서 특정 순간에 키보드를 보이거나 사라지게 하는 방법은 위의 showSoftInput ( ) 함수와 hideSoftInputFromWindow( ) 함수를 이용하는 방법 이외에 toggleSoftInput ( ) 함수를 이용하는 방법도 있습니다.

 

  • toggleSoftInput(int showFlags, int hideFlags):

 

toggleSoftInput ( ) 함수는 현 상황과 반대로 키보드를 제어합니다. 현 상황에서 키보드가 안 보이면 보이게 하고, 보이면 사라지게 합니다.

 

manager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

 

키보드로 액티비티 화면 조정

 

액티비티 화면에서 키보드가 보이면 액티비티가 차지하던 영역에 변화가 생깁니다. 키보드에 일정 정도의 크기를 할당해야 하므로 액티비티 자체를 어떻게 변경할 것인지를 설정해야 합니다.

 

  • 기본(설정 안 된 경우): adjustUnspecified와 stateUnspecified가 적용
  • adjustPan: 키보드가 올라올 때 입력 EditText에 맞춰 화면을 위로 올림
  • adjustResize: 키보드가 올라올 때 액티비티의 크기 조정
  • adjustUnspecified: 시스템이 알아서 상황에 맞는 옵션 설정
  • stateHidden: 액티비티 실행 시 키보드가 자동으로 올라오는 것 방지
  • stateVisible: 액티비티 실행 시 키보드가 자동으로 올라옴
  • stateUnspecified: 시스템이 적절한 키보드 상태를 설정하거나 테마에 따라 설정

 

우선 adjustPan으로 설정하는 예를 살펴보겠습니다.

 

<activity android:name=".Lab2Activity" android:windowSoftInputMode="adjustPan">

 

adjustPan으로 설정하고 액티비티를 실행하면 키보드가 올라올 때 EditText에 글 입력이 가능하도록 화면을 위로 올려줍니다.

 

 

그런데 그림 15-30을 보면 액티비티의 초기 상태에 키보드가 올라오지 않았습니다. 액티비티가 실행되면서 초기에 키보드가 자동으로 올라오게 설정하려면 stateVisible을 함께 설정해 줍니다.

 

<activity android:name=".Lab2Activity"

android:windowSoftInputMode="adjustPan|stateVisible">

 

이번에는 adjustResize로 설정하는 예입니다.

 

<activity android:name=".Lab2Activity" android:windowSoftInputMode="adjustResize">

 

adjustResize로 지정하면 키보드를 위해 액티비티 크기를 조정하게 됩니다.

 

 

전체 액티비티 화면을 위로 밀어 올린 게 아니라, 크기를 재조정하면서 키보드가 올라왔습니다. 그런데 초기 상태에 키보드가 자동으로 올라왔습니다. 때에 따라 초기에 키보드가 자동으로 올라오지 않게 설정해야 하는 경우가 있습니다. 이때 stateHidden을 함께 설정합니다.

 

<activity android:name=".Lab2Activity"

android:windowSoftInputMode="adjustResize|stateHidden">

 

이렇게 설정하면 초기 상태는 키보드가 안 보이며 EditText에 포커스를 주는 순간 크기가 재조정되어 올라오게 됩니다.