ANDROID/Android 개발 이슈 & 해결

[Android] 화면 터치로 키보드 내려가게 하기

주 녕 2022. 2. 25. 02:12
728x90

 

프로젝트에서 UI를 개발하다보니 키보드와 화면이 같이 올라가게 하거나, 키보드만 올라가게 해야 할 때가 생겼다.

키보드만 올라갈 때는 키보드에 가려진 위젯을 사용하기 위해서 사용자가 키보드를 내려야 하는데 이 과정을 편하게 하기 위해서 화면을 터치하면 키보드가 내려가게 끔 개발하고자 하였다.

 

화면 터치로 키보드 내려가게 하기

우선 코드는 Fragment에서 사용하였기 때문에 Fragment를 담고 있는 Activity를 불러와서 사용해야 했다.

Activity에서 사용하는 경우에는 activity/requireActivity() 대신 this를 사용!

    private fun hideKeyboard() {
        if (activity != null && requireActivity().currentFocus != null) {
            val inputManager: InputMethodManager = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            inputManager.hideSoftInputFromWindow(requireActivity().currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    }

이제 화면을 터치하면 hideKeyboard 메서드가 작동하게 해야 하기 때문에 Fragment의 onCreateView()에서 작성을 했다. 배경을 터치하면 키보드가 내려가게 하고 싶었기 때문에 최상위 레이아웃인 binding.root를 클릭했을 때 해당 작동이 이루어지도록 했다.

Activity에서 사용하는 경우에는 onCreate()에서!

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        _binding = FragmentObNicknameBinding.inflate(inflater, container, false)

        ...
        binding.root.setOnClickListener {
            hideKeyboard()
        }
        ...
    }

 

레이아웃과 상관없이 키보드만 올라가게 하기

위의 기능이 필요했던 이유는 키보드로 인해서 가려지는 UI가 있기 때문이었다.디폴트 상태는 화면 최하단 아래 키보드가 올라가서 전체적인 레이아웃이 키보드 위에 위치하게 된다.

 

→ 위젯을 아래 코드와 같이 화면 최하단을 기준으로 배치했다면 해당 위젯은 키보드와 함께 올라가게 되는 것이다.

app:layout_constraintBottom_toBottomOf="parent"

 

AndroidManifest.xml

    <application
        ...>
        <activity android:name=".~Activity"
            android:windowSoftInputMode="adjustNothing"/>

원하는 Activity에 android:windowSoftInputMode="adjustNothing" 속성을 추가하면

더 이상 키보드는 레이아웃과 상관없이 올라가게 되고, 레이아웃은 키보드 뒤에 위치하게 된다.

 

디폴트 상태 / 키보드만 올라가게 만들기

 

키보드 속성 정리

android:windowSoftInputMode=""
  • activity가 focus될 때의 soft keyboard 상태
  • soft keyboard를 위한 공간을 확보하도록 창의 크기를 어떻게 조절할지
  • soft keyboard가 창의 일부를 가릴 때, 현재 focus가 표시되도록 컨텐츠를 이동할지 등의 activity 창 조절

값은 'state~'나 'adjust~' 값 중 하나를 조합한 것이어야 한다

<activity android:windowSoftInputMode="stateVisible|adjustResize" ... >

< state~ >

  • stateUnspecified : soft keyboard의 상태를 지정하지 않음 (기본)
  • stateUnchanged : activity가 앞으로 나올 때, soft keyboard가 마지막으로 사용된 상태(숨김/표시)
  • stateHidden : 사용자가 activity를 적극적으로 이동할 때 숨겨짐
  • stateAlwaysHidden : activity에 입력 포커스가 있는 경우, 항상 숨겨짐
  • stateVisible : 사용자가 activity를 적극적으로 이동할 때 표시됨
  • stateAlwaysVisible : 창이 입력 포커스를 받으면, 표시됨

< adjust~ >

  • adjustUnspecified : (기본)
  • adjustResize : 터치형 soft keyboard를 위한 공간을 확보하도록 기본 창의 크기를 조절
  • adjustPan : soft keyboard를 위한 공간을 확보하기 위한 기본 창의 크기를 조절X 
    → 현재 focus를 가리지 않고 사용자가 입력하는 것을 볼 수 있도록 자동으로 이동

 

 

reference >

https://developer.android.com/guide/topics/manifest/activity-element.html

 

 

728x90