안드로이드에서 레이아웃 XML파일을 View객체로 만들기 위해서는 LayoutInflater를 이용한다.
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.my_layout, parent, false);
이렇게 간단하게 사용 할 수 있다.
LayoutInflater 생성하기
1. Context#getSystemService()
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.my_layout, parent, false);
2. Activity#getLayoutInflater()
LayoutInflater inflater = getLayoutInflater();
액티비티에서는 LayoutInflater를 쉽게 얻어올수 있도록 getLayoutInflater() 메소드를 제공한다. 엑티비티의 윈도우에 있는 getLayoutInflater()로 포워딩 해준다.
// android/app/Activity.java
public LayoutInflater getLayoutInflater() {
return getWindow().getLayoutInflater();
}
3. LayoutInflater.from()
LayoutInflater inflater = LayoutInflater.from(context)
View view = inflater.inflate(R.layout.my_layout, parent, false);
LayoutInflater에서는 LayoutInflater를 쉽게 생성 할 수 있도록 static factory 메소드 LayoutInflater.from()
을 제공한다. (내부적으로 getSystemService를 호출함)
// android/view/LayoutInflater.java
public static LayoutInflater from(Context ctx) {
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (inflater == null) {
throw new AssertionError("LayoutInflater not found.");
}
return inflater;
}
4. View 팩토리 메서드
View view = View.inflate(context, R.layout.my_layout, parent)
View에서는 LayoutInflater의 inflate까지 한번에 실행하는 View.inflate()를 제공한다. (내부에서는 LayoutInflater.inflate를 수행함) 이때 주의할점은 parent를 지정한다면 자동으로 attach됨.
// android/view/View.java
public static View inflate(Context context, int resource, ViewGroup root) {
LayoutInflater factory = LayoutInflater.from(context);
return factory.inflate(resource, root);
}
View inflate하기
inflate(int resource, ViewGroup root, boolean attachToRoot)
- 레이아웃 XML파일을 View객체로 만들기 위해서는 LayoutInflater내의 inflater 메서드를 사용.
- resource: view를 만들고 싶은 레이아웃 파일의 id,
- root:
attachToRoot
가true
일경우 생성되는 View가 추가될 부모 뷰,attachToRoot
가false
일 경우에는LayoutParams
값을 설정해주기 위한 상위 뷰, null로 설정할경우android:layout_xxxxx
값들이 무시됨. - attachToRoot:
true
일 경우 생성되는 뷰를 root의 자식으로 만든다,false
일 경우 root는 생성되는 View의 LayoutParam을 생성하는데만 사용된다.
// /android/view/LayoutInflater.java
// Temp is the root view that was found in the xml View temp;
...
ViewGroup.LayoutParams params = null;
if (root != null) {
// Create layout params that match root, if supplied params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
// Set the layout params for temp if we are not attaching.
temp.setLayoutParams(params);
}
}
...
if (root != null && attachToRoot) {
root.addView(temp, params);
}
요약
- XML레이아웃 파일에서 뷰를 생성할때는 LayoutInflater를 이용해야 한다.
- LayoutInflater는 LayoutInflater.from(context)를 이용하여 얻을 수 있다.
- LayoutInflater객체의 inflate메서드를 이용하여 새로운 뷰를 생성 할 수 있다.
- root를 지정하지 않을 경우 xml상의 최상위 뷰의 android:layout_xxxxx들은 무시된다. (참고자료)
- attachToRoot를 true로 설정할경우 뷰를 생성할때 자동으로 root의 자식으로 추가된다.
참고자료: [https://developer.android.com](https://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int, android.view.ViewGroup, boolean) "https://developer.android.com")