본문 바로가기

ANDROID

[안드로이드] 데이터바인딩(DataBinding)을 사용할 때 include한 레이아웃의 View 참조하기

기존 프로젝트의 레이아웃이 다수의 레이아웃이 include된 뷰를 포함하고 있었는데,

 

기존 코드가 include 된 레이아웃의 뷰를 참조하고 있었고, 

 

이를 개별적으로 새로운 data binding 객체로 만들어 참조해 대체해보려 했지만 대실패하였다.

 

 

그런 한두시간의 삽질 뒤 찾은 대안이 있었는데, 대안은 아래와 같다.

 

1. include로 포함된 뷰를 가진 레이아웃의 data binding 클래스로부터 include된 레이아웃의 id를 우선 참조

 

예)

 

private lateinit var mainActivityBinding : MainActivityBinding

..

{
	...
    
    mainActivityBinding = DataBindingUtil.setContentView(this, R.layout.main_activity_layout)
    
    mainActivityBinding.데이터바인딩이만들어준View의참조값
    
    ..
    
}

 

2. 여기에다가 기존에 참조하려고 했던 include된 레이아웃 내의 뷰의 ID를 참조하면 뷰를 조작할 수 있게 된다.

(문장으로 보면 복잡하지만 레이아웃>include된 레이아웃>뷰 순서로 가장 후순위에 있는 뷰를 참조하는 과정이라 생각하면 될 것 같다.)

 

주의할 점은 binding 클래스로부터 include된 레이아웃을 참조할땐 데이터바인딩이 만들어준 객체를 따라가면 되지만,

 

그 객체 내부의 뷰를 다시 참조할 때는 레이아웃의 선언되어 있는 id의 형식을 그대로 기입해야만 함.

 

예 ) 데이터바인딩시에는 main_view라는 id를 가진 뷰를 참조하게 되면 mainView라는 객체가 자동으로 참조가 되지만,

sub_view라는 id를 가진 뷰 안의 뷰를 참조할 때에는 mainActivityBinding.mainView.sub_view 라는 형식으로 가져가야 함.

 

 

private lateinit var mainActivityBinding : MainActivityBinding

..

{
	...
    
    mainActivityBinding = DataBindingUtil.setContentView(this, R.layout.main_activity_layout)
    
    mainActivityBinding.데이터바인딩이만들어준View의참조값.기존에참조하려던레이아웃의id그대로
    
    ..
    
}

 

마지막으로 여기에서 include된 layout에는 데이터바인딩에 사용하는 레이아웃의 형식을 따라서는 참조가 불가능하다는 점 주의.

 

간단하게 데이터바인딩으로 참조해온 레이아웃 xml은 데이터바인딩의 형식을 적용,

 

여기 내부에 include로 포함된 서브 레이아웃은 기존 레이아웃 형태 그대로 유지하면 됨.