728x90
⚠️ 2021.06.09에 작성된 글입니다 ⚠️
키보드 관련 이전 포스팅 보기 👉 [Android] 키보드 표시하기, 숨기기
구현 순서
- 키보드 클래스 생성 (키보드 높이 구하는 메소드, 현재 키보드 보이는지 여부 반환하는 메소드)
- 뷰에서 키보드 제어 (showKeyboard, hideKeyboard)
키보드 클래스
키보드 높이를 구하기 위해서는, 다음과 같은 순서로 진행된다.
- 원래 뷰의 높이(a)를 구한다.
- 키보드가 올라왔을 때의 뷰 높이(b)를 구한다.
- 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() // 액티비티가 화면에 더이상 표시되지 않으면 키보드 내리기
}
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 |