안드로이드의 inflate

1 minute read

안드로이드에서 화면에 나타나는 UI 구성은 xml 파일에 담겨있다. 화면을 구성하는 레이아웃과 뷰는 xml에 정의돼있는데, 이를 코드 상에서 접근할 수 있게 만들어야 한다. inflate는 ‘부풀리다’라는 뜻을 갖고 있는데, xml에 정의된 뷰를 부풀려 객체화시키는 것을 뜻한다.

//액티비티의 onCreate 콜백
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView 내에서 inflate를 한다
        setContentView(R.layout.activity_main)
    }
}

//PhoneWindow.setContentView
@Override
public void setContentView(int layoutResID) {
    if (mContentParent == null) {
        installDecor();
    } else {
        mContentParent.removeAllViews();
    }
    //여기서 inflate를 한다
    mLayoutInflater.inflate(layoutResID, mContentParent);
    final Callback cb = getCallback();
    if (cb != null && !isDestroyed()) {
        cb.onContentChanged();
    }
}

//Fragment의 onCreateView
class ExampleFragment : Fragment() {

    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View {
        //여기서 inflate를 한다.
        return inflater.inflate(R.layout.example_fragment, container, false)
    }
}

프래그먼트의 onCreateView에 전달된 인자는 다음과 같다.

  • inflater: 프래그먼트 내 어느 뷰든 inflate할 수 있는 LayoutInflater
  • container: 프래그먼트가 부착될 상위 ViewGroup
  • savedInstanceState: Bundle 객체로 프래그먼트 상태가 저장돼있다.

LayoutInflater.inflate에 전달되는 인자는 다음과 같다.

  • inflate되는 레이아웃의 리소스 ID
  • inflate된 레이아웃의 상위가 될 ViewGroup. onCreateView에 전달된 container를 전달한다.
  • attachToRoot: inflate된 레이아웃이 inflate 중에 부모에 붙을 것인지를 뜻하는 불린 값. 이때 시스템이 붙여주기 때문에 false를 넣어야 한다.

attachToRootfalse라고 해서 부모이 붙지 않는 것이 아니라 지금 당장은 붙지 않는 것이다. truefalse든 언젠가는 부모에 부착된다. 단, 프래그먼트처럼 시스템이 부모에 부착을 해서 직접 부착을 해도 되지 않는 경우는 무조건 false를 전달해야 한다.

Comments