안드로이드의 inflate
안드로이드에서 화면에 나타나는 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
되는 레이아웃의 리소스 IDinflate
된 레이아웃의 상위가 될ViewGroup
.onCreateView
에 전달된container
를 전달한다.attachToRoot
:inflate
된 레이아웃이inflate
중에 부모에 붙을 것인지를 뜻하는 불린 값. 이때 시스템이 붙여주기 때문에 false를 넣어야 한다.
attachToRoot
가 false
라고 해서 부모이 붙지 않는 것이 아니라 지금 당장은 붙지 않는 것이다. true
든 false
든 언젠가는 부모에 부착된다. 단, 프래그먼트처럼 시스템이 부모에 부착을 해서 직접 부착을 해도 되지 않는 경우는 무조건 false
를 전달해야 한다.
Comments