상세 컨텐츠

본문 제목

[Android]레이아웃 인플레이션

Android 개발

by mobile 2013. 2. 12. 00:09

본문

반응형

동적 방식이란 자바 프로그램 내부에서 그림과 같이 각각 사전에 만들어 놓은 작은 단위의 뷰나 XML 레이아웃들을 필요에 따라 서로 묶어 하나의 XML 문서로 만들어 화면 전체에 출력하거나 아니면 화면의 적당한 위치에 출력시켜주는 방법을 말한다.


인플레이션을 사용하는 이유는 다음과 같다.

- 화면 출력 속도 향상

: 대부분 하나의 XML 레이아웃과 그 안에 텍스트뷰나 버튼 화면만을 사용했지만, 실제 대부분의 상용 애플리케이션은 다수의 XML 레이아웃들로 구성된다. 상식적으로 생각할 때 화면의 작은 부분에 변화가 발생하였을 때 전체 화면 단위로 출력하는 것보다 해당 부분만을 화면에 출력하는 것이 시스템 성능에 도움이 되낟.

- 문서 공간 절약

: 전체 화면의 공간을 차지하는 XML 문서를 여러 개 만드는 것보다 용도별로 XML 문서를 나누어 보관하면 상대적으로 적은 공간으로 차지한다.

- XML 레이아웃 공유

: 부품처럼 작은 단위로 나룰 수 있다는 이점은 안드로이드 내 애플리케이션들 사이에서 XML 파일들을 서로 공유할 수 있다는 장점을 제공한다.


인플레이션을 사용하면 애플리케이션의 메모리 낭비를 줄일 수 있고 프로세싱하는 시간을 절약 할 수 있다. 인플레이션하는 목적과 방식에 따라 다음과 같이 나눌 수 있다. 인플레이터는 인플레이션 기능을 제공하는 클래스 이다.


- 레이아웃 인플레이터(android.view.LayoutInflater 클래스)

- 메뉴 인플레이터(android.view.MenuInflater 클래스)


▶ 인플레이션을 사용하는 방식

1) 레이아웃 인플레이터를 만든다.

: 레이아웃이나 뷰를 화면에 출력하기 위해 안드로이드 시스템으로부터 LayoutInflater 객체를 얻는 작업을 말한다. 안드로이드에서 레이아웃을 인플레이트시키는 방법은 아래와 같이 3종류가 있다.

LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);

LayoutInflater inflater=Activity.getLayoutInflater();

LayoutInflater inflater=LayoutInflater.from(Context context);


2)원하는 뷰나 레이아웃들을 읽어 객체화 시킨다.

: 레이아웃을 인플레이트시켜 뷰나 레이아웃의 상위 클래스인 뷰나 뷰그룹의 변수와 매핑시킨다.

ViewGroup MainLayout = inflater.inflate(R.layout.main);

ViewGroup SubTitleLayout = inflater.inflate(R.layout.sub_title_layout);

View row = inflater.inflate(R.layout.row, null);

위에서 사용한 public View inflate(int resource, ViewGroup root) 메서드는 XML 리소스로 부터 인플레이트시키고 뷰(또는 뷰그룹)를 반환한다. 만약 인플레이트를 시킬 수 없다면 InflateException 이라는 예외가 발생한다. 두 번째 매개변수는 특정 레이아웃을 루트 요소로 지정한다면, 루트 요소와 연결된 뷰(또는 뷰그룹)로 반환된다.

매개변수로 지정할 뷰 그룹이 없으면 현재 XML만을 인프레이트되는 뷰(또는 뷰그룹)로 반환한다.


3) 계층 구조를 만든다.(옵션 사항)

: 위에서 인플레이션한 객체들을 그대로 사용할 수 있으며, 또는 아래와 같이 묶어서 사용할 수 있다. 여기서 2단계에서 뷰나 뷰그룹을 객체화 시킨 뷰 객체들은 ViewGroup.addView() 메서드를 사용하여 상호 간의 계층화된 구조로 만들게 된다. 이러한 구조는 부모와 자식으로 구성되므로 자식(또는 하단)으로 구성되는 뷰나 뷰그룹들은 자동으로 부모가 설정한 크기와 위치의 속성에 따라 영향을 받게 된다.


ViewGroup MainLayout = inflater.inflate(R.layout.main);

ViewGroup SubTitleLayout = inflater.inflate(R.layout.sub_title_layout);

View row = inflater.inflate(R.layout.row, null);


MainLayout.addView(SubTitleLayout,1);

MainLayout.addView(row,2);


4) 화면에 출력한다.

: 일단 위의 작업을 수행하면 자바 프로그램 내부에서 화면에 출력 가능한 뷰와 뷰그룹들이 만들어 진다. 만들어진 뷰그룹이나 뷰들은 화면에 출력하는 메서드를 사용하여 화면에 출력한다. 예를들어 setContentView() 메서드를 사용하여 화면에 출력시킬 수 잇으며, setView() 메서드를 이용하여 다이얼로그 형태로 원하는 뷰들을 출력할 수 있다.


- 방법 1: setContentView 사용하기

setContentView(getLayoutInflater().inflate(R.layout.buttons, null));

Button b = (Button)findViewById(R.id.button_left);

먼저 getLayoutInflater().inflate(R.layout.buttons,null))를 사용하여 ViewGroup 인스턴스로 만든 다음 setContentView() 메서드를 사용하여 화면에 XML 레이아웃을 출력한다. 그리고 버튼을 프로그램에서 사용하기 위해 이전과 같이 Activity.findViewById(int)를 사용하여 변수에 매핑 시켜준다.


- 방법 2: 버튼 변수에 레이아웃 인플레이트를 매핑하기

Button b = (Button)getLayoutInflater().inflate(R.layout.buttons, null);

getLayoutInflate() 메서드 또는 getSystemService(LAYOUT_INFLATER_SERVICE) 메서드를 사용하여 뷰 클래스를 인스턴스 화 한다. 여기서 XML 파일 내 오직 하나의 버튼만이 존재하므로 여기서 inflate() 메서드를 사용하여 버튼 변수 b에 직접 매핑하였다.


- 방법 3: 레이아웃 인플레이터한 후 아이디를 사용하여 버튼 필드에 매핑하기

View v = Activity.getLayoutInflater().inflate(R.layout.buttons, null));

Button b = (Button)v.findViewById(R.id.button_left);

먼저 레이아웃을 인플레이트시키고 ffindViewById() 메서드를 사용하여 버튼을 매핑하는 방법이다. XML 문장에 하나 이상의 뷰가 존재할 경우 각 아이디별로 뷰를 구분해 주어야 한다.


인플레이트시키면 XML 문서가 인스턴스화되기 때문에 변수와 매핑이 가능하다. 단지 화면에 출력만하지 않은 것뿐이다. 이러한 사실은 setcontentView() 메서는 XML 문서를 인스턴스 시키면서 화면에 출력하는 두 가지 기능을 제공하는 것이다.


반응형

관련글 더보기

댓글 영역