티스토리 뷰

[Android] LayoutInflater attachToParent parameter mean?

안드로이드 프로젝트를 여러개 진행해보면서 레이아웃을 inflate 할 때 항상 inflate 메서드의 마지막 파라미터인 attachToParent/Root 를 거의 무조건 false 로 한다 로만 알고 있었지 정확한 의미가 항상 궁금했다.

attachToRoot: whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.

공식 문서를 보면 위와 같이 루트에 대하여 계층적으로 연결할지를 결정하는데 만약 false 인 경우 루트는 XML의 루트 뷰에 대한 올바른 서브 클래스를 만드는데만 사용된다. 라고 하는데 상당히 난해하다.

지금 or 지금 말고의 문제다

attachToParent 파라미터의 주요 차이점은 사실 이렇습니다.

true : child 뷰를 parent 뷰에 지금 즉시 붙이겠다.

false : child 뷰를 parent 뷰에 지금 붙이지 않겠다.

그럼 false 인 경우에는 언제 parent 뷰에 붙이겠다는 거지?

나중에 붙이겠다는 의미는 코드상으로 아래 등과 같다.

parent.addView(childView)

많이 하는 오해로는 attachToParent 의 인자를 false 로 주면 부모 뷰 아래 추가되지 않을 것이라는 오해인데 사실 틀렸다.

true 던 false 던 parent 뷰 아래 childe 뷰로 추가된다. 단지 그 시간이 문제일 뿐이다. (언제 붙이느냐의 문제라는 것)

예를들면,

inflater.inflate(child,parent,false);
parent.addView(child);

해당 코드는 아래와 동일한 코드라고 볼 수 있다.

inflater.inflate(child,parent,true);

절대 해서는 안되는 것

반응형

만일 현재 parent 뷰에 child 뷰를 추가할 의무가 없는 경우에는 attachToParnet 파라미터를 true 로 두면 절대 안됩니다.

예를 들어 프레그먼트를 사용한다고 했을 때,

public View onCreateView(LayoutInflater inflater,ViewGroup parent,Bundle bundle)
  {
        super.onCreateView(inflater,parent,bundle);
        View view = inflater.inflate(R.layout.image_fragment,parent,false);
        .....
        return view;
  }

만약 세 번째 파라미터(attachToParnet)를 true 로 한다면 IllegalStateException 예외가 발생하게되기 때문입니다. (아래 때문)

getSupportFragmentManager()
      .beginTransaction()
      .add(parent, childFragment)
      .commit();

해당 코드에서는 하위뷰로 붙일 필요(의무)가 없는데 true를 넘겨주면서 즉시 붙여주었기 때문에 이후에 FragmentManager 가 해당 의무를 다하려고 add 하려는 찰나! 이미 붙였기 때문에 IllegalStateException 예외가 발생하는 것 이지요.

위와 같은 예시에서는 인플레이트 시 Child 뷰에 추가해줄 의무가 없으므로 false 로 해주는 것이 맞겠지요. 그래서 무조건 false 를 주라는 말이 있었나 봅니다. (강의를 하는 강사면 이런것도 알려주면 좋을텐데... 하지말고 궁금하면 내가 찾아봐야지머)

참고로 attachToParnet 가 false 인 경우 parent 뷰는 child 뷰의 터치 이벤트를 가져오지 않는다고 한다.

도움 되셨다면 공감 버튼 부탁드립니다.

2021.08.06 - [Android] - 안드로이드 아키텍처 개요 : 전체적인 구조를 알아보자 (Android Architecture)

2021.08.04 - [Android/클린 아키텍처] - [Clean Architecture] 15-안드로이드에서의 Dagger2

2021.08.02 - [Android/App] - [Android] 뮤직 플레이어 앱 만들기 with ExoPlayer, Kotlin

Reference
1. https://stackoverflow.com/questions/12567578/what-does-the-layoutinflater-attachtoroot-parameter-mean
댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함