티스토리 뷰
뷰 컨트롤
• 사용자와의 상호작용으로 인해서 뷰를 조작하는 방법
• 뷰에 이벤트가 발생했을 때 처리하는 방법
• xml에 존재하는 뷰를 kotlin으로 가져와서 처리할 수 있다.
1. findViewById
• xml에 존재하는 뷰를 kotlin으로 가져오는 방법.
• findViewById(R.id.아이디) : 해당 아이디의 view를 가져온다.
- Id -> xml에서 부여한 view의 id
• 그 외에도 view를 가져오는 방법에는 kotlinx, databinding 등이 있다.
- kotlinx : 번거로운 findViewById 과정을 생략 가능. 하지만 deprecated -> 가급적으로 사용을 피해야 한다.
- databinding : 뷰와 데이터를 묶는 방법. 심화 내용이다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text1"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#FF0000"
android:text="안녕하세요." />
</androidx.appcompat.widget.LinearLayoutCompat>
package com.example.fastcampus
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
class ViewControl_03 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_control03)
// 뷰를 코틀린으로 가져오는 방법
val text1: TextView = findViewById(R.id.text1) // findViewById를 통해 id가 text1인 뷰를 가져옴.
Log.d("testt", text1.text.toString()) // 안녕하세요. 출력
}
}
2. Listener
• 이벤트가 발생했을 때 수신하는 역할
• 종류가 다양하고, 각 뷰에 특화된 리스너가 많다.
-> 다 외울 수 없고, 그때그때 찾아가면서 사용하는 것이 좋다.
ex) 버튼을 클릭했을 때, 글자를 입력했을 때, 드래그를 했을 때 등...
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ViewControl_03">
<Button
android:id="@+id/button1"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="버튼1" />
<Button
android:id="@+id/button2"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="버튼2" />
<Button
android:id="@+id/button3"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="버튼3" />
</androidx.appcompat.widget.LinearLayoutCompat>
package com.example.fastcampus
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
class ViewControl_03 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_control03)
// xml의 button1, button2, button3 가져오기
val button1: Button = findViewById(R.id.button1)
val button2: Button = findViewById(R.id.button2)
val button3: Button = findViewById(R.id.button3)
// 1. 클래스 이용
class MyClickListener : View.OnClickListener {
override fun onClick(v: View?) {
Log.d("testt", "버튼1 클릭!")
}
}
val myClickListener: MyClickListener = MyClickListener()
button1.setOnClickListener(myClickListener)
// 2. 익명 클래스
val myClickListener2 = object: View.OnClickListener {
override fun onClick(v: View?) {
Log.d("testt", "버튼2 클릭!")
}
}
button2.setOnClickListener(myClickListener2)
// 3. 람다
button3.setOnClickListener {
Log.d("testt", "버튼3 클릭!")
}
}
}
3. setOnClickListener 코드 설명
• 1. 클래스 이용
- setOnClickListener는 View.OnClickListener 타입을 인자로 받는다.
- View.OnClickListener는 onClick 메소드를 가지는 인터페이스임.
- 따라서, View.OnClickListener를 상속받는 클래스를 생성하여 onClick을 override하고, 객체를 생성하여 setOnClickListener에 넣으면 작동함.
• 2. 익명 클래스
- View.OnClickListener 타입의 익명 객체를 만들어 setOnClickListener에 넣어주면 작동한다.
// 2. 익명 클래스
val myClickListener2 = object: View.OnClickListener {
override fun onClick(v: View?) {
Log.d("testt", "버튼2 클릭!")
}
}
button2.setOnClickListener(myClickListener2)
• 3. 람다
- 코틀린의 SAM, 람다 문법 등을 이용하여 크게 생략할 수 있다.
button3.setOnClickListener {
Log.d("testt", "버튼3 클릭!")
}
- 2번 익명 객체가 3번 람다식으로 생략되는 과정이 너무 자세하게 설명이 잘 되어 있는 글을 발견했습니다. 제가 참고한 글 링크 첨부합니다. https://toonraon.tistory.com/37
이 글은
패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online
강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.
'📱 Android > 💡 개념' 카테고리의 다른 글
[Android/개념] 6. Context(컨텍스트) (0) | 2022.10.28 |
---|---|
[Android/개념] 5. 앱 구성 요소(App Component) (0) | 2022.10.27 |
[Android/개념] 3. Activity(액티비티) (0) | 2022.10.21 |
[Android/개념] 2. Log(로그) (0) | 2022.10.21 |
[Android/개념] 1. 프로젝트 구조 (0) | 2022.10.20 |