안드로이드 학습(Kotlin)

13. View 이벤트 (키, 포커스)

리저브콜드브루 2025. 2. 4. 10:48
728x90
반응형

Key Event

  • 키 이벤트는 사용자가 하드웨어 키보드 또는 소프트 키보드를 사용할 때 발생한다.
  • Android 기기에서는 볼륨 키, 백 버튼, 엔터 키 등이 키 이벤트를 발생시킨다.

 

주요 메서드

메서드 설명
setOnKeyListener() View에 키 이벤트 리스너 등록
onKeyDown() 키를 눌렀을 때 호출
onKeyUp() 키를 뗄 때 호출
onKeyLongPress() 키를 길게 눌렀을 때 호출

 

주요 키 코드 (KeyCode)

상수 (KeyCode)
Back 버튼 KeyEvent.KEYCODE_BACK
Enter 키 KeyEvent.KEYCODE_ENTER
볼륨 업 KeyEvent.KEYCODE_VOLUME_UP
볼륨 다운 KeyEvent.KEYCODE_VOLUME_DOWN
방향키 (위) KeyEvent.KEYCODE_DPAD_UP
방향키 (아래) KeyEvent.KEYCODE_DPAD_DOWN

 

키 이벤트 처리 예시 (setOnKeyListener 사용)

val editText = findViewById<EditText>(R.id.editText)
editText.setOnKeyListener { v, keyCode, event ->
    if (event.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
        Toast.makeText(this, "엔터 키 입력됨", Toast.LENGTH_SHORT).show()
        true  // 이벤트 소비
    } else {
        false
    }
}
  • 엔터 키를 누를 때 Toast 메시지 출력
  • true를 반환하면 이벤트가 소비되어 더 이상 전달되지 않는다.

 

키 이벤트 처리 예시 (onKeyDown, onKeyUp 오버라이드)

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    return when (keyCode) {
        KeyEvent.KEYCODE_BACK -> {
            Toast.makeText(this, "뒤로 가기 버튼 눌림", Toast.LENGTH_SHORT).show()
            true  // 뒤로 가기 기본 동작 방지
        }
        KeyEvent.KEYCODE_VOLUME_UP -> {
            Toast.makeText(this, "볼륨 업!", Toast.LENGTH_SHORT).show()
            true
        }
        else -> super.onKeyDown(keyCode, event)
    }
}
  • super.onKeyDown() 호출 시 기본 동작 유지

Focus Event

  • 포커스 이벤트는 사용자가 입력을 위해 특정 View(주로 EditText)에 포커스를 줄 때 발생한다.
  • 입력 필드에 포커스를 주면 키보드가 표시되고, 포커스를 잃으면 키보드가 사라지는 등의 동작을 처리한다.

 

주요 메서드

메서드 설명
setOnFocusChangeListener() 포커스 변경 이벤트 리스너 등록
hasFocus() View가 현재 포커스를 가지고 있는지 확인
requestFocus() 프로그래밍적으로 포커스를 요청
clearFocus() 현재 포커스 제거

 

포커스 이벤트 처리 예시 (포커스 변경 감지)

val editText = findViewById<EditText>(R.id.editText)
editText.setOnFocusChangeListener { v, hasFocus ->
    if (hasFocus) {
        Toast.makeText(this, "포커스 얻음", Toast.LENGTH_SHORT).show()
    } else {
        Toast.makeText(this, "포커스 잃음", Toast.LENGTH_SHORT).show()
    }
}
  • hasFocus가 true면 포커스를 얻은 것이고, false면 포커스를 잃은 상태

 

포커스 이벤트 처리 예시 (코드로 포커스 제어)

val editText = findViewById<EditText>(R.id.editText)
val button = findViewById<Button>(R.id.button)

button.setOnClickListener {
    editText.requestFocus()  // EditText에 포커스 강제 설정
}
  • requestFocus()를 통해 프로그래밍적으로 포커스를 이동할 수 있다.

 

포커스 제거 및 키보드 숨기기

fun hideKeyboard(view: View) {
    val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(view.windowToken, 0)
}

editText.setOnFocusChangeListener { v, hasFocus ->
    if (!hasFocus) {
        hideKeyboard(v)  // 포커스를 잃으면 키보드 숨기기
    }
}
  • InputMethodManager를 사용하여 소프트 키보드 숨기기 처리
728x90
반응형