이동식 저장소

Inflate()에서 매개변수 attachToParent의 의미 본문

Primary/Android

Inflate()에서 매개변수 attachToParent의 의미

해스끼 2020. 12. 22. 21:41

중요: 커스텀 뷰가 안 보이면 ``attachToParent``를 ``true``로 설정해 보자.


``ViewBinding``의 ``inflate()`` 메소드는 세 개의 매개변수를 받는다.

 

  • ``inflater``: ``LayoutInflater``
  • ``parent``: 뷰를 붙일 ``ViewGroup``. 사용하는 뷰(액티비티, 프래그먼트, 커스텀 뷰 등)에 따라 다른 값을 사용한다.
  • ``attachToParent``: ``Boolean`` 값.

이 글에서 살펴볼 매개변수는 ``attachToParent``이다. 사실 마이트윗에서 ``ViewBinding``으로 바꾸고 나니 어떤 뷰가 계속 안 보이길래 2시간 동안 삽질했는데, ``attachToParent``를 ``false``에서 ``true``로 바꾸기만 하면 되었다.

 

그래서 한번 탐구해 보았다. 도대체 ``attachToParent``는 무엇인가?

시점의 차이

``attachToParent``가 ``true``이면 현재 뷰를 ``parent``에 즉시 추가한다. ``false``이면 ``parent``에 나중에 추가한다. 나중에라는 말은 ``parent.addView(childView)`` 등 현재 뷰를 ``parent``에 붙이는 모든 코드를 의미한다. 즉 ``attachToParent``가 ``false``일지라도 나중에 뷰를 붙이는 코드를 실행하면 뷰가 ``parent``에 붙여지게 된다.

 

예를 들어 프래그먼트에서 ``ViewBinding``을 사용할 때는 ``attachToParent``가 ``false``여야 한다. 왜냐하면 일반적인 구현에서는 ``FragmentManager``가 프래그먼트를 자동으로 ``add()``하기 때문이다. 만약 ``true``로 설정했다면, ``inflate()``에서 이미 추가된 프래그먼트를 ``FragmentManager``가 중복해서 붙이려고 하는 상황이 되기 때문에 ``IllegalStateException``이 발생한다. 따라서 내가 직접 뷰를 붙여야 한다는 확신이 없으면 ``attachToParent``를 ``true``로 해서는 안 된다.

결론

웬만하면 ``attachToParent``는 ``false``로 하는 게 좋은 듯 하다. 가끔 뷰가 갑자기 보이지 않는다던가 하는 문제가 있을 때만 ``true``로 놓고 테스트해 보자.

 

참고: android - What does the LayoutInflater attachToRoot parameter mean? - Stack Overflow

Comments