- 프로그램 기본 틀을 알아보자.

 

만약 XML 파일에 Button을 만들었다면, 개발자가 별도로 new Button()을 해야될텐데 그렇지 않다.

이는 '레이아웃 인플레이터'라는 내부 시스템이 XML에 정의된 위젯들을 객체화시켜준다.

 

새로운 프로젝트를 생성하면 onCreate() 메서드가 하나 있다.

 

1
2
3
4
5
6
7
8
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
cs

  

상기 onCreate 메서드만 있어도 어플리케이션 화면이 뜬다.

결국, setContentView 메서드가 XML 레이아웃(activity_main.xml)의 내용을 프로그램과 연동시켜주는 메서드임을 알 수 있다.

 

정리해보면...

안드로이드에서 화면을 구성하는 방법으로 XML 레이아웃을 사용하는데,

이 XML 레이아웃 파일의 내용은 애플리케이션이 실행될 때 메모리로 로딩되어 객체화된다.

이렇게 XML 레이아웃에 정의된 내용이 메모리 상에 객체화되는 과정을 '인플레이션(Inflation)'이라고 한다.

 

'인플레이션' 과정이 중요한 이유..

XML 레이아웃 파일의 경우 프로젝트가 빌드되는 시점에 이진 파일로 컴파일되어 애플리케이션에 포함되긴 하지만,

실행 시점이 되어서야 로드되어 메모리 상에 객체화되기 때문이다.

 

즉, setContentView() 메서드의 역할은

 1. XML 레이아웃의 내용을 메모리 상에 객체화한다. (인플레이션 한다.)

 2. XML의 내용을 해당 액티비티 화면에 붙여준다.

 

그렇기 때문에 setContentView 함수를 거치기 전에 activity_main 내부의 위젯(버튼, 텍스트 등..)을 접근하게 되면

아직 객체화가 되지 않은 위젯에 접근하게 되게 되므로 Null Exception이 발생하게 된다.

 

- 레이아웃 안에 부분 레이아웃 추가하기.

 

setContentView 메서드는 액티비티의 화면 전체를 설정하는 역할을 하므로...

화면 안에서 일부 뷰만을 위한 XML 레이아웃을 메모리 상에 객체화하려면 별도의 인플레이션 객체를 사용해야 한다.

이러한 기능을 위해서 'LayoutInflater' 라는 클래스를 제공한다.

 

LayoutInflater 클래스 사용.

 

1
2
3
4
5
6
7
8
   //inflater를 얻어와 infater 변수에 담는다.
   LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
   //부분 화면으로 띄울 Layout을 객체화(inflation) 시키고 화면에 표시시켜주는 함수.
   //param 1 : 띄우고자 하는 XML File Name.
   //param 2 : param 1의 화면을 어디에 보이게 할 것인지.
   //parma 3 ; true 면 "바로 붙여라" 라는 의미
   inflater.inflate(R.layout.sub1, m_container, true);
cs

 

즉, LayoutInflater 클래스 타입의 변수를 getSystemService 함수를 이용하여 얻어온 후 inflate 라는 함수를 이용하여

객체화 시켜 사용하면 된다. 

 

D:\Android\Project\SampleInflater

+ Recent posts