UroA 개발 블로그

[Android] LayoutInflater 사용하기 본문

Programming/Android

[Android] LayoutInflater 사용하기

UroA 2015. 11. 20. 23:35

안드로이드 LayoutInflater 사용하기

 

안드로이드에서 레이아웃 XML파일을 View객체로 만들기 위해서는 LayoutInflater를 이용해야 합니다.

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
View view = inflater.inflate(R.layout.my_layout, parent, false);  

이렇게 간단하게 사용 할 수 있지만 LayoutInflater를 생성하는법과 XML레이아웃을 inflate할때 알아야 할것과 주의해야 할것을 자세하게 알아 보겠습니다.

LayoutInflater 생성하기

1. 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 팩토리 메서드
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의 자식으로 추가된다.
Comments