profile image

L o a d i n g . . .

반응형

구글에서 자체적으로 안드로이드 기기의 키보드 노출/비노출 이벤트에 대한 리스너를 제공해주지 않는다.

 

그래서 따로 화면의 사이즈를 구해서 키보드가 올라왔는지 안올라 왔는지 구해야 하는데 공통 Utlle 클래스를 하나 만들어 두면 편하다

 

class KeyboardVisibilityUtils(
    private val window: Window,
    private val onShowKeyboard: ((keyboardHeight: Int) -> Unit)? = null,
    private val onHideKeyboard: (() -> Unit)? = null
) {

    private val MIN_KEYBOARD_HEIGHT_PX = 150

    private val windowVisibleDisplayFrame = Rect()
    private var lastVisibleDecorViewHeight: Int = 0


    private val onGlobalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener {
        window.decorView.getWindowVisibleDisplayFrame(windowVisibleDisplayFrame)
        val visibleDecorViewHeight = windowVisibleDisplayFrame.height()

        if (lastVisibleDecorViewHeight != 0) {
            if (lastVisibleDecorViewHeight > visibleDecorViewHeight + MIN_KEYBOARD_HEIGHT_PX) {
                // Calculate current keyboard height (this includes also navigation bar height when in fullscreen mode).
                val currentKeyboardHeight = window.decorView.height - windowVisibleDisplayFrame.bottom
                // Notify listener about keyboard being shown.
                onShowKeyboard?.invoke(currentKeyboardHeight)
            } else if (lastVisibleDecorViewHeight + MIN_KEYBOARD_HEIGHT_PX < visibleDecorViewHeight) {
                // Notify listener about keyboard being hidden.
                onHideKeyboard?.invoke()
            }
        }
        // Save current decor view height for the next call.
        lastVisibleDecorViewHeight = visibleDecorViewHeight
    }

    init {
        window.decorView.viewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener)
    }

    fun detachKeyboardListeners() {
        window.decorView.viewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener)
    }
}

우와 같이 하나 만들어 논 후 사용할 뷰에서는 다음과 같이 정의 해서 사용하면 된다.

 

private lateinit var keyboardVisibilityUtils: KeyboardVisibilityUtils
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    keyboardVisibilityUtils = KeyboardVisibilityUtils(window,
        onShowKeyboard = {
            // show keyboard
            val keyboardHeight = it
        },
        onHideKeyboard = {
            // hide keyboard
        })
}

우와 같이 정의해서 등록해두면 키보드가 show/hide 되었을 때 활동할 이벤트 처리가 아주 간편해 진다.

참고로  onShowKeyboard 콜백에서는 키보드의 높이값도 넘어온다.

 

이 방법이 제일 간편해서 나는 이렇게 만들어두고 쓴다.

반응형
복사했습니다!