안드로이드 스튜디오 Activity에서 layout의 위젯의 아이디를 찾아 올 때 findViewById를 사용했는데 View Binding을 이용하면 코드가 좀 더 간결해지고 안전성이 높아진다
<뷰바인딩 설정 방법>
뷰바인딩을 사용하려면 gradle에 뷰바인딩을 사용한다는 코드를 넣어줘야한다
Gradle Scripts -> build.gradle.kts(Module :app)으로 들어가서 코드를 추가해준다
android{
...
buildFeatures{
viewBinding = true
}
}
이렇게 코드를 넣어주면 뷰바인딩 사용이 가능하다
이후 Activityd에서 아래 코드를 적어주는데 inflate는 xml에 있는 뷰를 객체화 시켜준다고 생각하면 된다
setCpmtemtView(R.layout.activity_main) 에 R.layout.activity_main대신 view를 넣어준다
이때 binding.root를 따로 선언하지 않았다면 binding.root를 넣어서 setCpmtemtView(binding.root)로 작성해도 무방하다
package com.spartabasic.spartatest
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.spartabasic.spartatest.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
//추가된 부분
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//추가된 부분
binding = ActivityMainBinding.inflate(layoutInflater)
enableEdgeToEdge()
setContentView(binding.root) //번경된 부분
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
}
빨간줄이뜬다면 싱크를 맞춰주면 해결된다
이때 레이아웃 파일의 이름을 기반으로 한 바인딩 클래스를 자동 생성한다
바인딩 객체의 이름은 레이아웃 파일이름에 'Binding'을 붙여서 만들어지게 되며 예를들어 레이아웃 파일 이름이 activity_main.xml일 경우 바인딩클래스 이름은 ActivityMainBinding이 되고 fragment_home.xml인 경우 FragmentHomeBinding이 된다
<실습 예시>
만약 layout에 textView 아이디가 myText이고 Button 아이디가 myButton이라고 가정했을때
버튼을 눌렀을 때 다른 텍스트를 띄우는 코드는 다음과 같이 쓸 수 있다
package com.spartabasic.spartatest
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.spartabasic.spartatest.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
enableEdgeToEdge()
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
binding.myButon.setOnClickListener {
binding.myText.text = "good"
}
}
}
뷰바인딩을 쓰지 않았다면 코드는 아래와 같았을 것이다
package com.spartabasic.spartatest
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.spartabasic.spartatest.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
val text = findViewById<TextView>(R.id.myText)
val button = findViewById<Button>(R.id.myButton)
button.setOnClickListener() {
text.text = "good"
}
}
이렇게 하나하나 findViewById로 찾아서 써야한다
Android의 4대 컴포넌트 (Activity, Service, Broadcast Receiver, Content Provider) (0) | 2024.06.18 |
---|---|
API를 이용해서 검색결과를 최신순으로 정렬하는 방법 (0) | 2024.06.14 |
지역변수와 전역변수 (0) | 2024.04.01 |
Git 명령어 정리 2 (브랜치 활용) (0) | 2024.03.12 |
Git 명령어 정리 (0) | 2024.02.28 |