LayoutInflater를 이해하기 전에 inflater에 대해서 미리 알아야 한다.
우리는 안드로이드 개발을 하게 되면 대개 먼저, 화면을 정의하는 xml 코드를 작성한다.
위 예시에서는 버튼과 텍스트뷰를 화면에 배치했다.
그러나 xml코드만으로는 안드로이드의 제 기능을 발현할 수 없고 완성된 어플리케이션이라고 할 수 없다. 가령 예를 들어 버튼을 클릭하여 다른 액티비티로의 전환이나 다양한 기능들을 제공하고 싶다면 java 클래스 파일도 같이 필요하다.
이렇게 안드로이드 개발에는 XML 소스코드와 JAVA 클래스 파일이 한 쌍을 이루는 것임을 이해하면 된다.
그러나 실제 개발에 들어간 우리는 다양한 XML과 JAVA 소스코드 파일을 접하게 된다.
그렇다면 어떤 XML 코드가 JAVA파일과 쌍을 이루는 지 알 수 있을까?
JAVA 소스코드를 들여다보면 setContentView()에 xml 파일이 파라미터로 설정된 것을 알 수 있다.
여기서 직관적으로 우리는 xml과 java 소스코드의 한 쌍을 맺어주는 것이 이 setContentView임을 알 수 있다.
더 자세히 들어가보자면 xml 소스코드에서 버튼을 배치했다.
이 버튼을 클릭하면 간단한 토스트 메시지를 출력하고 싶다고 가정해보자.
버튼의 id를 참조하여 java소스코드에서 참조해 사용할 것이다.
즉 xml에 배치된 view(버튼이나 텍스트뷰)는 java소스코드에서 쓰이기 때문에 객체화가 되어야 한다는 것이다. 역으로 객체화가 되어있어야 자바코드에서 객체들을 참조해 기능들을 적용할 수 있다는 말이다.
객체화를 시키는 기능을 제공하는 메소드가 바로 setContentView()이다.
xml 레이아웃들이 객체화되는 과정은 메모리에 로딩되어 화면(뷰그룹)으로 드러나는데,
이 과정을 Inflation이라 한다.
앞에서 java코드에서 객체화된 버튼을 참조해 기능들을 적용할 수 있다고 했다. 위의 코드예시처럼 setContentView를 Button 객체를 참조한 이후에 적용하면 어떻게 될까? 버튼 객체를 참조하려면 객체화가 되어야 하는데 그렇지 못해 오류가 발생한다.
inflate를 실사례에 빗대어 쉽게 이해해보자면 xml 코드를 건축 설계과정에 빗댈 수 있다. 그리고 설계가 실제 건물로 드러나는 것을 화면(뷰그룹)으로 나타나는 것에 비유할 수 있다. 즉 inflate(부풀어지다)를 통해 실체화, 객체화가 이루어지는 것이다.
지금까지는 하나의 xml 레이아웃이 하나의 메인 화면으로 객체화되는 과정을 들여다보았다.
그러나 메인화면의 일부분에 다른 xml 소스코드를 객체화하여 삽입할 수 없을까? 이또한 가능하다. 바로 이 기능을 제공하는 것이 LayoutInflater 클래스이다.
또한, 다른 xml 소스코드를 객체화하여 화면 일부분에 삽입했으므로 xml 소스코드에 배치된 뷰들을 참조하여 기능을 적용할 수 있다.
이해를 돕기 위해 소스코드를 들여다보자.
activity_second.xml 레이아웃 파일에 텍스트뷰와 버튼을 삽입하고 아래 남는 여백에 LinearLayout을 만들었다. 여기서 파란 배경색은 빈 여백, LinearLayout 부분을 표시한 것이다.
빈 부분, LinearLayout에 다른 xml 레이아웃인 sub_layout.xml을 객체화하여 삽입한다는 것이 이 예시코드의 목적이다.
그러기 위해서는 LayoutInflater 클래스를 사용해야하며, 이 클래스는 시스템서비스에서 제공된다.
LayoutInflater는 SystemService로 제공되므로 이를 getSystemService()를 통해 가져온다.
즉, inflater를 생성한다.
LayoutInflater클래스에는 inflate()메소드가 있는데 이 메소드는 삽입할 레이아웃 리소스와 어디에 이 리소스를 삽입할 것인지에 대한 파라미터를 넘겨받는다.
이 예시의 경우 앞서 빈 공간에 만들어둔 LinearLayout에 sub_layout.xml 레이아웃 파일을 삽입하는 것이다.
LayoutInflater는 자주 사용된다. 실제 개발에서 자주 접하는 커스텀 리스트뷰에서도 자신이 커스터마이징한 list.xml 레이아웃 파일을 convertView에 붙여서 리스트를 꾸리게 된다.
'▶개발 > Android' 카테고리의 다른 글
[안드로이드]DrawerLayout(슬라이드메뉴) 구현하기 (2) | 2018.09.24 |
---|---|
[안드로이드]editText의 값을 listview로 추가하기 (0) | 2018.08.11 |
[Android] Dialog Message 기본 만들기 (0) | 2018.07.11 |
안드로이드의 정확한 UI 표현 레이아웃 ScalableLayout (0) | 2018.07.03 |
안드로이드 스튜디오에서 Gradle이란? (0) | 2018.06.26 |