Android/Android

[안드로이드] setcontentview(), Layoutinflater

_hong 2023. 1. 31. 21:28

Setcontentview

inflate 하는 과정을 거친다. 리소스 id에 해당하는 파일의 xml의 내용을 파싱하고 xml의 구조에 따라 뷰 그룹 객체와 뷰의 객체를 생성하고 그들의 관계를 추가하고 메모리에 적재한다. 내부적으로 layoutinflater를 사용한다. 

 

layoutinflater

Xml에 있는 리소스를 실제 메모리에 올려준다. setcontentview() 를 통해 인플레이트 할 수 있지만 동적으로 뷰 객체를 가져와야하는 경우 LayoutInflater를 사용한다. 예를들어 리사이클러뷰에서 아이템뷰를 만들때 또는 커스텀 뷰를 만들때, 프래그먼트를 사용할때 따로 layoutinflater를 사용해서 inflate 하게된다. 메모리에 올리는 시점이 불명확해서 동적으로 인플레이트 하는경우 사용한다. 프래그먼트는 뷰를 기존 액티비티에 따로 인플레이트를 해서 레이아웃을 만드는것이기 때문에 layoutinflater를 사용한다.

 

SystemService 객체를 통해서 또는 액티비티 내에서 제공하는 getLayoutInflater를 통해  LayoutInflater 객체를 얻을 수 있다. + LayoutInflater.from()를 사용할수도 있다.

 

성능적인 이유 때문에 inflate는 전처리된 xml 파일들에 의존한다. 그러므로 런타임에 XmlPullParser로 파싱을 하는것을 불가능하고 XmlPullParser에 의해 파싱된 리소스 파일(R.~)의 아이디를 찾아서 메모리에 로드한다.

 

커스텀뷰

 

커스텀 뷰는 아래와 같을 때 도움이 될 수 있습니다.

  • 현재 일반적인 안드로이드 구성 요소로는 원하는 작용이나 애니메이션 또는 UI를 만들 수 없을 때
  • 코드 재사용성을 위해

 

커스텀 뷰를 만들때 뷰의 속성 파일인 attr을 선언하고 뷰그룹을 상속받을 새로운 클래스를 만든다. 

그 후 layoutinflate를 통해서 뷰를 inflate하고 뷰의 속성값을 지정해준다. onMeasure() (뷰의 크기 측정), onLayout()(뷰의 크기와 위치 할당), onDraw()를 작성한다.

 

 

 

https://developer.android.com/reference/android/view/LayoutInflater

 

LayoutInflater  |  Android Developers

 

developer.android.com