안드로이드 LayoutInflater 사용하기

안드로이드에서 레이아웃 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: attachToRoottrue일경우 생성되는 View가 추가될 부모 뷰, attachToRootfalse일 경우에는 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")