Android 액티비티 제어 : 소프트 키보드

timothy jeong·2021년 11월 12일
0

Android with Kotlin

목록 보기
38/69

소프트 키보드 제어하기

시스템에서 제공하는 키보드(소프트 키보드)는 액티비티 화면에서 사용자가 글을 입력할 수 있는 뷰가 포커스를 가지는 순간 자동으로 올라온다. 그리고 사용자가 뒤로가기 버튼을 누르면 뷰가 자동으로 사라진다.

입력 매니저

그런데 때로는 코드에서 특정한 순간에 키보드를 올리거나 내려야 할 수도 있다. 이러한 기능은 InputMethodManager 클래스가 지원한다.

  • hideSoftInputFromWindow(IBinder windowToken, int flags) : 소프트 키보드가 화면에서 사라지게 한다.
  • showSoftInput(View view, int flags) : 소프트 키보드가 화면에 나타나게 한다.
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">

아래와 같은 속성들이 있다.

  • adjustPan : 키보드가 올라올 때 입력 에디트 텍스트에 맞춰 화면을 위로 올린다.
  • adjustResize : 키보드가 올라올 떄 액티비티의 크기를 조정한다.
  • adjustUnSpecified : 상황에 맞게 시스템이 알아서(기본값)
  • stateHidden : 액티비티 실행 시 키보드가 자동으로 올라오는 것을 방지한다.
  • stateVisible : 액티비티 실행 시 키보드가 자동으로 올라온다.
  • stateUnSpecified : 시스템이 적절한 키보드 상태를 설정하거나 테마에 따른다. (기본값)
profile
개발자

0개의 댓글