LayoutInflater
 - inflate의 사전적 의미 : 부풀리다. 팽창하다.
 - 안드로이드에서 inflate의 의미 : 전개


기능 
 1. XML 문서에 정의된 레이아웃과 Child 뷰의 속성을 읽어 실제 뷰 객체를 생성해내는 동작.
 2. 레이아웃의 정보대로 객체를 생성하고 속성 변경 메소드를 순서대로 호출하는 것.
 3. 동적으로 View를 교체할 수 있으며 복합적인 View를 여러 곳에서 공통으로 사용하고자할때 유용하다.


안드로이드에서 어떤 View가 화면에서 보일려면 반드시 객체화(인스턴스화)되어 있어야 된다.
안드로이드에서 뷰 객체를 생성하는 과정은 크게 2가지가 있다.

직접 코드 상에서 아래와 같이 생성하는 방법이 있고

1
Button b = new Button(this);      // this는 context

그리고 XML 파일을 통해 객체를 생성하는 방법이 있다. 
Inflate는 XML을 통해서 객체화 시키는 것을 의미한다.

보통 액티비티의 onCreate() 함수에서도 자주 쓰이는 setContentView() 메소드는 내부적으로
XML을 통해 뷰 객체를 생성하는 Inflate 과정이 포함되어 있다. 내부는 아래와 같이 동일하다.
1
2
3
4
setContentView(View.inflate(this, R.layout.main, null));
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = (View)inflater(R.layout.main, null);
serContentView(v);

결국 setContentView(R.layout.main)와 같이 리소스 아이디를 지정하지 않고, 직접 LayoutInflater를
이용해서 레이아웃 객체를 생성한 후 setContentView()를 통해서 그 생성된 레이아웃 객체를
올려도 동일한 결과가 나오게 된다.


Inflate에는 여러 종류의 메소드가 있다.
위에서 설명한 LayoutInflater, menu의 XML을 읽어들여 메뉴 객체를 구성하는 MenuInflater,
또 View 클래스의 정적 메소드로 inflate도 있다.

아래는 main layout 대신 커스터마이징된 dialog layout을 생성하는 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class AlertCustom extends Activity {
    ...
    @Override
    protected Dialog onCreateDialog(int id) {
        switch(id) {
        case CUSTOM_DIALOG :
            AlertDialog.Builder builder;
            AlertDialog alertDialog;
     
            LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
     
            View layout = inflater.inflate(R.layout.custom_dialog,
                    (ViewGroup) findViewById(R.id.layout_root));
     
            TextView text = (TextView) layout.findViewById(R.id.text);
            text.setText("Hello, this is a custom dialog!");
            ImageView image = (ImageView) layout.findViewById(R.id.image);
            image.setImageResource(R.drawable.icon);
     
            builder = new AlertDialog.Builder(this);
            builder.setView(layout);
            alertDialog = builder.create();
     
            return alertDialog;
        }
         
        return null;
    }
}

 

 출처 : http://warmz.tistory.com/579

+ Recent posts