findViewById를 사용하지 않고, XML의 view component에 접근하는 object를 반환받아 view에 접근하는 방식
"뷰 바인딩"은 뷰를 다루는 코드를 보다 쉽게 작성할 수 있게 해준다. 레이아웃 XML 파일에 정의되어 있는 뷰를 자동으로 생성된 클래스를 통해 자바/코틀린 코드에서 참조할 수 있게 해준다.
1) findViewById를 하나하나 선언할 필요X
2) Type-safe (레이아웃 내에서 정확한 view 타입을 찾아 맵핑함)
3) Null-safe (레이아웃에 없는 id를 findViewById를 했을 때의 NullPointerException 방지)
android{
buildFeatures{
viewBinding true
}
}
프로젝트 상 레이아웃 파일들 (xml 파일)이 바인딩 클래스라는 녀석이 생기게되고, 각 파일들에 선언해두었던 뷰 들의 id 들의 참조가 포함된다.
-> 자동으로 생성된 바인딩 클래스 이름은 레이아웃xml파일 이름에서 변경됨
예시) activity_main.xml -> ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding:ActivityMainBinding //전역으로 바인딩 객체 선언
private lateinit var adapter:RecyclerViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.activity_main) -->기존의 setContentView는 제거
binding=ActivityMainBinding.inflate(layoutInflater)
//자동생성된 뷰바인딩 클래스에서의 inflate라는 메서드를 활용해서 액티비티에서 사용할 바인딩클래스의 인스턴스 생성
setContentView(binding.root)
//getRoot메서드로 레이아웃 내부의 최상위 위치뷰의 인스턴스를 활용하여 뷰를 액티비티에 표시
//이제 binding변수를 이용하여xml내의 뷰 id를 마음껏 접근할수 있다!
//뷰id도 네이밍규칙 적용돼서 tv_message->tvMessage
//예시 activity_main.xml에 tv_message라는 TextView 있는경우
binding.tvMessage.setText("앙녕하세요")
fun initDogRecyclerView(){
binding.recyclerView.adapter=adapter
//activity.main에는 recyclerView라는 아이디를 가진 요소가 있음
binding.recyclerView.layoutManager=LinearLayoutManager(this)
}
https://choheeis.github.io/newblog//articles/2020-09/viewBinding
-> 뷰바인딩에 대한 설명
https://duckssi.tistory.com/42
-> 홍드로이드 View Binding
https://flow9.net/bbs/board.php?bo_table=android&wr_id=27
-> Activity/Fragment/Adapter에서 뷰바인딩 사용하기