Front-End/Kotlin

[Kotlin] View Binding과 Event

psy_er 2024. 4. 21. 02:51
728x90

[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
}
728x90

'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