Learn & Run

Android - 인플레이션(Inflation) 이해하기 (2) 본문

Android

Android - 인플레이션(Inflation) 이해하기 (2)

iron9462 2021. 6. 10. 00:03

이전 포스팅에서는 setContentView 메서드를 통해서 전체 화면이 인플레이션 과정을 거친 후 실제 화면으로 보여지게 된다는 것을 알수 있었다. 하지만 FrameLayout이나 Adapter를 사용할 때처럼 전체 화면 중에서 일부분만을 차지하는 화면 구성요소들을 XML레이아웃에서 로딩하여 보여주고 싶을 때 (부분화면일 경우) LayoutInflater의 inflate 메서드를 사용할 수 있다. 이번 포스팅에서 직접 다루어 봄으로써 부분 화면에 대한 사용 예시를 확인해 보도록 하자.

 

 

 

1. 부분 화면 띄우기

 

 

사용자로써 우리가 사용하는 대부분 앱들은 시작하면서 초기화된 전체 화면뿐만 아니라 다양한 화면들이 보여지고 사라진다는 것을 알고있다. 전체 화면이 보여진 이후에도 부분 화면들로 보이는 것들을 제어할 수 있다는 것을 의미한다. 이때 우리가 사용하는 것이 LayoutInflater의 inflate메서드 이다. 이전 포스팅에서 확인해 본 것 처럼 기본 프로젝트를 생성하면 setContentView(int resId)를 통해 실제 화면으로 보여지게 하는 것과 같은 방식이라고 할 수 있다.

 

 

activity_main.xml 파일을 위와 같이 준비해 주었다. 앱을 실행하면 흰색 배경에 버튼 하나만 보일 것이다. 하지만 버튼을 클릭한다면 새로운 View가 나타나도록 하고싶다면 어떻게 해야할까?

 

첫 번째로 버튼 클릭이벤트를 진행한다. 버튼을 클릭했을 때 setContentView(int resId)에서 보이던 것과 비슷한 로직이 보인다. getSystemService(String name)는 주어진 매개변수에 대응되는 안드로이드가 제공하는 시스템-레벨 서비스를 요청한다. 이 서비스로부터 시스템에서 제공하는 디바이스나 안드로이드 프레임워크내 기능을 사용할 수 있다. inflater의 inflate 메서드를 통해서 layout_add.xml 파일을 인플레이션하여 frameLayout에 붙이게 된다.

 

 

이제 앱을 실행시킨 후에 버튼을 눌러보자. 그러면 FrameLayout layout_add.xml 파일이 붙어 노출되는 것을 확인할 있다.

 

 

전체 화면이 먼저 초기화 된 이후에 클릭 이벤트를 통해서 새로운 부분화면이 인플레이션 과정(레이아웃 리소스들이 메모리에 객체화)을 거쳐 실제 화면에 나타난 것을 확인할 수 있다.

 

 

2. Adapter 에서 사용 예시 (BaseAdapter 상속)

 

 

실제 프로젝트를 진행하고 있는 코드인데 아래 이미지를 확인해 보면서 인플레이션 감각을 익혀보도록 하자.

 

init(Context context) 메서드를 보면 마찬가지로 LayoutInflater를 통해 inflate 메서드를 사용하고 있다. Adapter를 구현할땐 각 item이 보여지는 레이아웃 파일을 만들게되는데 이것을 ViewGroup에 붙이게 된다. 이제 item_review.xml 파일이 객체화 되었으니 해당 레이아웃에 포함되어있는 리소스들에 접근할 수 있게 된다.

 

BaseAdapter를 상속한 ReviewAdapter의 getView 메서드를 잘 보면 view를 반환하고 있다. ItemView는 context를 파라미터로 넘겨주며 객체를 생성하고 있고 실제 ItemView가 생성될 때 내부에서 init 메서드를 실행하면서 인플레이션 과정이 일어나게 된다. 그래서 이 과정을 마친 ItemView는 getView의 반환값으로 넘겨주게 되며 Adapter에서 부분화면으로 만든 각 item의 View가 된다.

 

 

코딩을 하는 동안에 이전 직장에서 나를 항상 채찍했었던 말이 종종 떠오르곤 한다. '생각좀 하고 코딩하세요', '이 기술 사용에 대해 장단점을 알고 사용하시나요?'와 같은 말이다. 오늘도 나는 반성한다. 반성하면서 무엇이 부족한지, 필요한지 알아가며 내일은 오늘보다 더 성장할 것이라 믿는다.

 

+ 혹시나 수정해야 할 내용들이 있다면 댓글 달아주시면 감사하겠습니다. 또한 궁금증이 있으시다면 같이 고민하고 싶습니다.