-
[Android] LayoutInflater란안드로이드 2022. 3. 22. 20:32728x90반응형
LayoutInflater란?🤔
XML에 미리 정의해둔 틀을 실제 메모리에 올려주는 역할을 합니다.
Inflater 단어의 뜻은 부풀리다는 의미로 LayoutInflater 이 단어에서도 역할을 유추할 수 있습니다.
즉 LayoutInflater는 XMl에 정의된 Resource를 View 객체로 반환해 주는 역할을 합니다.
우리가 매번 사용하는 onCreate() 메서드에 있는 setContentView(R.layout.activity_main) 또한 Inflater 역할을 합니다.
LayoutInflater 생성 방법👀
- getSystemService : 가장 기본적인 방법으로 context에서 LayoutInflater를 가져오는 방법입니다.
val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
- getLayoutInflater : Activity에서는 LayoutInflater를 쉽게 얻어올 수 있도록 getLayoutInflater()를 제공합니다. Activity는 자신 Window의 LayoutInflater를 사용합니다.
val inflater : LayoutInflater = getLayoutInflater()
- LayoutInflater.from() : 흔히 사용되는 방법으로, LayoutInflater에 static으로 정의되어 있는 LayoutInflater.from을 통해 LayoutInflater를 만드는 방법입니다. 내부적으로 context의 getSystemService를 호출하고 있으며, 같은 context에서는 같은 객체를 리턴하기 때문에 굳이 멤버 변수로 선언해 놓지 않고 필요할 때마다 호출해서 사용해도 괜찮습니다.
val inflater : LayoutInflater = LayoutInflater.from(context)
- AsyncLayoutInflater : LayoutInflater는 동기적으로 뷰를 생성하기 때문에, support package에서는 비동기적으로 뷰를 만들 수 있는 AsyncLayoutInflater를 제공합니다. XML내의 뷰 hierarchy가 복잡하거나 UI스레드에서 inflate 하는데 시간이 오래 걸린다면 사용할 수 있습니다.
val inflater = AsyncLayoutInflater(context) inflater.inflate(R.layout.my_layout, parent) { view, resId, parent -> parent.addView(view) }
간단하게 비동기로 뷰를 생성할 수 있지만, 몇 가지 주의할 점이 있습니다.‼️
- parent의 generateLayoutParam()이 thread safe 해야 합니다.
- 생성자에서 Handeler를 만들거나 Looper.myLooper()를 사용하면 안 됩니다.
- LayoutInflater.Factory를 사용할 수 없습니다.
- Fragment를 inflate 할 수 없습니다.
View inflate 하기🔥
inflater에서 View 객체를 만들기 위해서는 inflate()를 사용하면 됩니다.
inflate(resource:Int,root:ViewGroup?, attachToRoot:Boolean)
- resource : View를 만들고 싶은 Layout 파일의 ID입니다. R.layout.MainActivity
- root : 생성될 View의 parent를 명시해줍니다. null일 경우에는 LayoutParams값을 설정할 수 없기 때문에 XML내의 최상위 android:layout_xxxxx값들이 무시되고 merge tag를 사용할 수 없습니다.
- attachToRoot : true로 설정할 경우 root의 자식 View로 자동으로 추가됩니다. 이때 root는 null 일 수 없습니다.
- return : attachToRoot에 따라서 리턴 값이 달라집니다. true일 경우 root가, false일 경우 XML 내 최상위 뷰가 리턴됩니다.
View.inflate()
View.inflate(context,R.layout.my_layout,parent)
View에서는 LayoutInflater의 inflate까지 한 번에 실행하는 View.inflate()를 제공하고 있습니다. (내부에서는 LayoutInflater.inflate를 수행함) 이때 주의할 점은 parent가 null이 아니면 자동으로 attach 됩니다.
출처
https://medium.com/vingle-tech-blog/android-layoutinflater-b6e44c265408반응형728x90반응형'안드로이드' 카테고리의 다른 글
[Android] Timber로 Debug 상태에서 로그 찍어내기 (0) 2022.04.30 [Android] ADB wifi 디버깅 방법(무선 디버깅) (0) 2022.03.26 [Android] 아키텍처 패턴(MVC,MVP,MVVM)에 대하여 (0) 2022.03.20 [Android] ConstraintLayout (0) 2022.03.19 [Android] Fragment에서 Google Map Api 사용하기 (0) 2022.03.18