[Kotlin] View Binding과 Event

< 뷰 바인딩 >
뷰 바인딩은 레이아웃 XML 파일에 선언한 뷰 객체를 코드에서 쉽게 이용하는 방법이다. 액티비티에서 findViewById() 함수를 이용하지 않고 레이아웃 XML 파일에 등록된 뷰 객체를 쉽게 사용할 수 있는 방법을 제공한다. 레이아웃 XML 파일에 등록된 뷰 객체를 포함하는 클래스가 자동으로 만들어집니다.
- build.gradle에 뷰 바인딩 설정
android{
viewBinding{
enable = true }}
자동으로 만들어지는 클래스의 이름은 레이아웃 XML 파일명을 따릅니다.
글자를 대문자로 하고 밑줄(_)은 빼고 뒤에 오는 단어를 대문자로 만든 후 'Binding'을 추가한다.
activity_main.xml -> ActivityMainBinding
item_main.xml -> ItemMainBinding
자동으로 만들어진 클래스의 inflate() 함수를 호출하면 바인딩 객체를 얻을 수 있습니다.
액티비티 화면 출력은 setContentView() 함수에 binding.root를 전달하면 됩니다.
- id 속성 부여
<TextView
android:id="@+id/text1"
android:layout_width
android:layout_height
android:text="hello" />
// 바인딩 객체 획득
val binding = ActivityMainBinding.inflate(layoutInflater)
// 액티비티 화면 출력
setContentView(binding.root)
// 뷰 객체 이용
binding.visibleBtn.setOnClickListener{
binding.text1.visibility = View.VISIBLE
}
< 터치 이벤트 >
위젯에 이벤트를 설정해 동작하게 한다. 터치 이벤트의 콜백 함수인 onTouchEvent()를 선언한다. 전달 매개변수는 MotionEvent 객체이며, 이 객체에 터치의 종류와 발생 지점(좌푯값)이 담깁니다.
class MainActivity : AppCompatActivity(){
override fun onTouchEvent(event: MotionEvent?): Boolean{
return super.onTouchEvent(event)
}
}
터치 이벤트의 종류
ACTION_DOWN : 화면을 손가락으로 누른 순간의 이벤트
ACTION_UP : 화면에서 손가락을 떼는 순간의 이벤트
ACTION_MOVE : 화면을 손가락으로 누른 채로 이동하는 순간의 이벤트
터치 이벤트 발생 좌표 얻기
onTouchEvent() 함수의 매개변수인 MotionEvent 객체로 획득
- x : 이벤트가 발생한 뷰의 x좌표
- y : 이벤트가 발생한 뷰의 y좌표
- rawX : 화면의 x좌표
- rawY : 화면의 y좌표
< 키 이벤트 >
사용자가 폰의 키를 누르는 순간에 발생한다.
콜백 함수 (이벤트 함수)
- onKeyDown : 키를 누른 순간의 이벤트
- onKeyUp : 키를 떼는 순간의 이벤트
- onKeyLongPress : 키를 오래 누르는 순간의 이벤트
class MainActivity2 : AppCompatActivity(){
override fun onKeyDown (keyCode: Int, event: KeyEvent?): Boolean {
Log.d("kkang", "onKeyDown")
return super.onKeyDown(keyCode, event)
}
override fun onKeyUp (keyCode: Int, event: KeyEvent?): Boolean {
Log.d("kkang", "onKeyUp")
return super.onKeyUp(keyCode, event)
}
}
첫 번째 매개변수는 키의 코드이며 이 값으로 사용자가 어떤 키를 눌렀는지 식별
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
when (keyCode){
KeyEvent.KEYCODE_0 -> Log.d("kkang", "0키를 눌렀네요")
KeyEvent.KEYCODE_A -> Log.d("kkang", "A키를 눌렀네요")
}
return super.onKeyDown(keyCode, event)
}
키 이벤트가 발생하는 키는 폰에서 제공하는 소프트 키보드의 키를 의미하지 않습니다. 안드로이드 시스템 버튼도 키로 취급하므로 이 버튼의 이벤트를 처리할 수 있습니다. 뒤로 가기 버튼 이벤트에는 앞에서 살펴본 onKeyDown()이나 onKeyUp() 함수를 이용할 수도 있지만, onBackPressed() 함수를 이용할 수도 있습니다. 제스처 내비게이션을 사용하고 있다면 사용자 제스처로 뒤로 가기를 하면 <뒤로 가기> 버튼을 누른 것과 같습니다. 사용자 제스처 뒤로 가기도 onKeyDown() 함수를 선언해 이벤트 처리가 가능합니다.
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean{
when(keyCode){
KeyEvent.KEYCODE_BACK -> Log.d("kkang", "BACK Button을 눌렀네요")
KeyEvent.KEYCODE_VOLUME_UP -> Log.d("kkang", "VOLUME_UP을 눌렀네요")
KeyEvent.KEYCODE_VOLUME_DOWN -> Log.d("kkang", "VOLUME_Down을 눌렀네요")
}
return super.onKeyDown(keyCode, event)
}
< 뷰 이벤트의 처리 구조 >
뷰 이벤트 처리는 이벤트 소스와 이벤트 핸들러로 역할이 나뉘며 이 둘을 리스너로 연결해야 이벤트를 처리할 수 있습니다
이벤트 소스 : 이벤트가 발생한 객체, 예제에서 checkbox
리스너 : 이벤트 소스와 이벤트 핸들러를 연결해 주는 함수, 예제에서 setOnCheckedChangeListener
이벤트 핸들러 : 이벤트 발생 시 실행할 로직이 구현된 객체, 예제에서 object
binding.checkbox.setOnCheckedChangeListener(object: CompoundButton.OnCheckedChangeListener){
overrid fun onCheckedChanged(p0: CompoundButton?, p1: Boolean){
Log.d("kkang", "체크박스 클릭")
}
})
람다함수를 이용해서 SAM 기법으로 구현하기
람다함수 왼쪽에는 함수에서 전달받은 매개변수, 오른쪽은 처리하는 동작
class MainActivity3 : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
val binding = ActivityMain3Binding.inflate(layoutInflater)
setContentView(binding.root)
binding.checkbox.setOnCheckedChangeListener{
compoundButton, b -> Log.d("kkang", "체크박스 클릭")
}
}
}
< 클릭과 롱클릭 이벤트 처리 >
ClickEvent, LongClickEvent는 뷰의 최상위 클래스인 View에 정의된 이벤트이다.
binding.button.setOnClickListener{
Log.d("kkang", "클릭 이벤트")
}
binding.button.setOnLongClickListener{
Log.d("kkang", "롱클릭 이벤트")
true
}
'Front-End > Kotlin' 카테고리의 다른 글
[Kotlin] 제트팩 라이브러리, Action Bar 메뉴 (1) | 2024.04.23 |
---|---|
[Kotlin] Dialog (1) | 2024.04.22 |
[Kotlin] Resourse의 종류와 특징 (1) | 2024.04.20 |
[Kotlin] RelativeLayout, FrameLayout, ConstraintLayout (0) | 2024.04.19 |
[Kotlin] GridLayout (0) | 2024.04.18 |