시스템에서 제공하는 키보드(소프트 키보드)는 액티비티 화면에서 사용자가 글을 입력할 수 있는 뷰가 포커스를 가지는 순간 자동으로 올라온다. 그리고 사용자가 뒤로가기 버튼을 누르면 뷰가 자동으로 사라진다.
그런데 때로는 코드에서 특정한 순간에 키보드를 올리거나 내려야 할 수도 있다. 이러한 기능은 InputMethodManager 클래스가 지원한다.
class MainActivity : AppCompatActivity() {
lateinit var manager: InputMethodManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
manager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
binding.shwoButton.setOnClickListener {
binding.editView.requestFocus()
manager.showSoftInput(binding.editView, InputMethodManager.SHOW_IMPLICIT)
}
binding.hideButton.setOnClickListener {
manager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
}
showSoftInput() 함수를 이용할 때 주의할 점은 첫번째 매개변수가 글이 입ㅂ력딜 뷰인데 이 뷰가 포커스를 가지지 않은 상태라면 키보드가 나타나지 않는다는 것이다. 따라서 강제로 포커스를 받도록 binding.editView.requestFocus() 코드가 위에 추가되었다.
액티비티 화면에 소프트 키보드가 올라오면 키보드가 세로로 일정한 크기를 확보한다. 그때 액티비티 화면은 어떻게 되어야 할지 설정할 수 있다. 키보드가 올라올때 액티비티가 함께 위로 올라가게할지, 아니면 액티비티의 크기를 조정할지 선택하는 것이다.
이런 설정은 필수가 아니며 일반적으로 시스템에서 액티비티의 상태를 보고 위로 올리거나 액티비티 크기를 조정해준다. 그런데 개발자가 직접 조정하고 싶다면 메니페스트 파일에서 activitiy 태그의 windowSoftInputMode 속성을 이용한다.
<activiy android:name=".MainActivity" android:windowSoftInputMode="adjustPan">
아래와 같은 속성들이 있다.