728x90
블로그 이사했습니다!
👇 블로그 이전 공지 👇
👇 새 블로그에서 글 보기 👇
[Android] 키보드 높이 이용해 키보드 올리기, 내리기 — Win Record (tistory.com)
구현 순서
키보드 클래스 생성 (키보드 높이 구하는 메소드, 현재 키보드 보이는지 여부 반환하는 메소드)뷰에서 키보드 제어 (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() // 액티비티가 화면에 더이상 표시되지 않으면 키보드 내리기
}
'android > kotlin' 카테고리의 다른 글
[Android][Kotlin] 컨텍스트 메뉴 Context Menu 만들기 (0) | 2021.06.21 |
---|---|
[Android][Kotlin] 하단 다이얼로그 BottomSheetDialog 구현하기 (1) | 2021.06.18 |
[Android][Kotlin] 뷰바인딩 ViewBinding 적용하기 (0) | 2021.06.12 |
[Android][Kotlin] 키보드 표시하기, 숨기기 (0) | 2021.06.06 |
[Android][Kotlin] 네트워크 연결상태 체크하기 (0) | 2021.06.04 |
댓글