Published 2023. 6. 2. 23:20
반응형
구글에서 자체적으로 안드로이드 기기의 키보드 노출/비노출 이벤트에 대한 리스너를 제공해주지 않는다.
그래서 따로 화면의 사이즈를 구해서 키보드가 올라왔는지 안올라 왔는지 구해야 하는데 공통 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 콜백에서는 키보드의 높이값도 넘어온다.
이 방법이 제일 간편해서 나는 이렇게 만들어두고 쓴다.
반응형
'[# 2]…My DevelopStory' 카테고리의 다른 글
[Android] Di 주입, Dagger 라이브러리 Hilt의 핵심개념 (1) | 2024.05.08 |
---|---|
[Android] Flow에 대하여, Flow란 무엇인가 (0) | 2024.05.08 |
[Flutter] Flutter의 미래 전망: 구글이 이끄는 크로스 플랫폼 앱 개발 혁신 (0) | 2023.06.01 |
[Android] Could not resolve all files for configuration ':app:debugCompileClasspath'. - Build Error (0) | 2023.05.30 |
[Android] open failed: EACCES (permission denied) (0) | 2023.05.27 |