기존 프로젝트의 레이아웃이 다수의 레이아웃이 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로 포함된 서브 레이아웃은 기존 레이아웃 형태 그대로 유지하면 됨.
'ANDROID' 카테고리의 다른 글
[안드로이드] 빌드 속도를 올리는 짧은 팁. (0) | 2023.03.23 |
---|---|
[안드로이드] SDK 버전에 구애받지 않고 별도의 클래스에서 이미지 asset 참조해 적용하기 (0) | 2019.11.06 |
[안드로이드] 데이터바인딩을 Fragment에 적용할 때의 유의할 점. (0) | 2019.10.03 |
[안드로이드] API 버전에 구애받지 않는 Notification 설정하기 (0) | 2019.09.18 |
[안드로이드] 여러 페이지를 담은 PDF 파일 생성하기 (1) | 2018.12.13 |