[Android] 키보드 높이 이용해 키보드 올리기, 내리기

2022. 10. 23. 05:00·Android
⚠️ 2021.06.09에 작성된 글입니다 ⚠️

 

 

키보드 관련 이전 포스팅 보기 👉 [Android] 키보드 표시하기, 숨기기

 

구현 순서

  1. 키보드 클래스 생성 (키보드 높이 구하는 메소드, 현재 키보드 보이는지 여부 반환하는 메소드)
  2. 뷰에서 키보드 제어 (showKeyboard, hideKeyboard)

 


키보드 클래스

키보드 높이를 구하기 위해서는, 다음과 같은 순서로 진행된다.

  1. 원래 뷰의 높이(a)를 구한다.
  2. 키보드가 올라왔을 때의 뷰 높이(b)를 구한다.
  3. a - b를 하여 키보드 높이를 알아낸다.
import android.graphics.Rect
import android.view.View

class Keyboard {
    private var isKeyboardShowing: Boolean = false // 현재 키보드 보이는지 여부
    private var keyboardHeight: Int = -1 // 키보드 높이

    // 키보드 높이 구하기
    private fun getKeyboardHeight(targetView: View) {
        val rectangle = Rect()
        targetView.getWindowVisibleDisplayFrame(rectangle)
        val screenHeight: Int = targetView.rootView.height // 현재 뷰(activity, fragment)의 전체 높이
        val tmpKeyboardSize: Int = screenHeight - rectangle.bottom // 예상 키보드 높이

        // 뷰 높이의 10%가 예상 키보드 높이보다 낮을 경우 키보드 올라와있다고 판단
        if (tmpKeyboardSize > screenHeight * 0.1) {
            keyboardHeight = tmpKeyboardSize // 키보드 높이 세팅
            isKeyboardShowing = true
        } else {
            isKeyboardShowing = false
        }
    }

    // 키보드 현재 보이는지 여부
    fun isShowing(targetView: View): Boolean {
        getKeyboardHeight(targetView)
        return isKeyboardShowing
    }
}

뷰에서 키보드 올리기, 내리기

액티비티에서의 코드이다. 아래 코드를 BaseActivity에 두고 사용하면 편리하다.

val keyboard = Keyboard() // 키보드 클래스의 객체
lateinit var rootView: View // 루트 뷰
var isKeyboardShowing: Boolean = false // 현재 키보드 보이는지 여부
val imm: InputMethodManager by lazy { // 키보드 매니저
    getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    // rootView 초기화
    rootView = window.decorView
    rootView.viewTreeObserver.addOnGlobalLayoutListener { // 뷰에 변화가 있을 때마다 실행되는 리스너
        isKeyboardShowing = keyboard.isShowing(rootView)
    }
    ...
}

// 키보드 올리기
fun showKeyboard() {
    imm.toggleSoftInput(
        InputMethodManager.SHOW_FORCED,
        InputMethodManager.HIDE_NOT_ALWAYS
    )
}

// 키보드 내리기
fun hideKeyboard() {
    val webToken: IBinder? =currentFocus?.windowToken // 현재 포커스를 가진 뷰의 웹 토큰
    
    if (windowToken == null) { // 웹 토큰이 null인 경우 toggleSoftInput 메소드 사용
        if (isKeyboardShowing) { // 현재 키보드 보일 경우 키보드 토글
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
        }
    } else { // 키보드 내리기
        imm.hideSoftInputFromWindow(windowToken, 0)
    }
}

override fun onStop() {
    super.onStop()
    hideKeyboard() // 액티비티가 화면에 더이상 표시되지 않으면 키보드 내리기
}

InputMethodManager 관련 메소드가 궁금하다면?

728x90
저작자표시 비영리 변경금지 (새창열림)

'Android' 카테고리의 다른 글

[Android] 하단 다이얼로그 BottomSheetDialog 구현하기  (0) 2022.10.23
[Android] 뷰바인딩 ViewBinding 적용하기  (0) 2022.10.23
[Android] 키보드 표시하기, 숨기기  (0) 2022.10.23
[Android] Thread - 이미지 바꾸기  (0) 2022.10.23
[Android] Thread - 텍스트 변경하기  (0) 2022.10.23
'Android' 카테고리의 다른 글
  • [Android] 하단 다이얼로그 BottomSheetDialog 구현하기
  • [Android] 뷰바인딩 ViewBinding 적용하기
  • [Android] 키보드 표시하기, 숨기기
  • [Android] Thread - 이미지 바꾸기
Wintinue
Wintinue
201 Created!
  • Wintinue
    Win Record
    Wintinue
    • 📘 Post (68)
      • Android (32)
      • Nest.js (1)
      • NGINX (1)
      • Error (10)
      • AWS (1)
      • Git (3)
      • IT용어 (4)
      • CMD (2)
      • Language (5)
        • PHP (3)
        • Java (2)
      • Project (5)
        • 개인 프로젝트 (3)
        • 팀 프로젝트 (2)
  • 링크

    • Github
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.3
Wintinue
[Android] 키보드 높이 이용해 키보드 올리기, 내리기
상단으로

티스토리툴바