본문 바로가기
android/kotlin

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

by 윈 Win 2021. 6. 9.
728x90

 

블로그 이사했습니다!

 

👇 블로그 이전 공지 👇

블로그 이전 안내 (tistory.com)

 

 

👇 새 블로그에서 글 보기 👇

[Android] 키보드 높이 이용해 키보드 올리기, 내리기 — Win Record (tistory.com)

 

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

⚠️ 2021.06.09에 작성된 글입니다 ⚠️ 키보드 관련 이전 포스팅 보기 👉 [Android] 키보드 표시하기, 숨기기 구현 순서 키보드 클래스 생성 (키보드 높이 구하는 메소드, 현재 키보드 보이는지 여

win-record.tistory.com

 

 


키보드 관련 이전 포스팅 보기

 

구현 순서

  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 관련 메소드가 궁금하다면?

댓글