1. Inflation


XML 레이아웃에서 정의된 내용이 메모리에 객체화되는 것을 말한다.


MainActivity.java 파일에서 activity_main.xml 파일을 이해하려면 

setContentView 메소드의 파라미터로 해당 XML 레이아웃 파일을 지정해주면 내부적으로 인플레이션 과정이 진행된다.


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


- setContentView() 메소드


화면에 나타낼 뷰를 지정하고, XML 레이아웃의 내용을 메모리 상에 객체화한다.

1
2
public void setContentView (int layoutResID)
public void setContentView (View view [, ViewGroup.LayoutParams params])
cs


XML 레이아웃 파일의 내용이 메모리에 객체로 만들어지면 소스 코드에서는 그 객체들을 찾아 사용할 수 있다.

객체를 찾을 때는 findViewById 메소드를 이용할 수 있으며 

XML 레이아웃에 뷰를 추가할 때 넣어둔 id 속성의 값을 파라미터로 사용한다.


1
Button button = (Button) findViewById(R.id.button1);
cs



2. Layout Inflater

 

- LayoutInflater() 클래스

: 시스템 서비스로 제공되는 클래스로서, 

 전체 화면 중에서 일부분만을 차지하는 화면 구성 요소들을 XML 레이아웃에서 로딩하여 보여준다.


화면 전체를 나타내는 액티비티의 경우에는 setContentView 메소드를 이용해 XML 레이아웃을 인플레이션할 수 있지만, 

XML 레이아웃 파일 안에 포함되지 않는 뷰의 경우에는 setContentView 메소드를 통해 인플레이션되지 않는다.

setContentView 메소드는 액티비티를 위해 만들어 놓은 것이기 때문에 뷰를 위한 인플레이션에는 사용할 수 없다.

실제로 액티비티와 뷰가 내부적으로 관리되는 방식이 달라서 그런 것인데, 이 때문에 뷰의 경우에는 직접 인플레이션을 해야 한다.


레이아웃 인플레이터 객체는 시스템 서비스 객체로 제공되기 때문에 getSystemService 메소드를 이용해 참조할 수 있다.

1
getSystemService(Context.LAYOUT_INFLATER_SERVICE)
cs


뷰 객체가 있으면 그 뷰 객체에 인플레이션한 결과물을 설정하게 된다.

1
2
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.activity_sub, frame_layout, true);
cs


- Layout Inflater Example


XML 레이아웃의 이름은  activity_sub.xml로 만들어져 있고 이 XML 레이아웃에 들어가 있는 뷰들은 메모리에 객체로 만들어진 후에 frame_layout 뷰 객체에 설정된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MainActivity extends AppCompatActivity {
    
    Button button;
    FrameLayout frame_layout;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.button);
        frame_layout = (FrameLayout)findViewById (R.id.frame_layout);
        
        button.setOnClickListener(new View.onClickListener(){
            @Override
            public void onClick(View v){
                LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                inflater.inflate(R.layout.activity_sub, frame_layout, true);
            }
        });
    }
}
cs


이런 방식은 새로운 뷰를 정의할 때 자주 볼 수 있는데, 동적으로 레이아웃이 변경, 추가되는 경우에도 사용된다.





출처: https://www.edwith.org/boostcourse-android/lecture/17056/

'Android' 카테고리의 다른 글

ListView (리스트뷰) - 예제  (0) 2018.05.06
ListView (리스트뷰)  (0) 2018.05.06
Bitmap Button 만들기  (0) 2018.05.01
Nine Patch (나인패치)  (0) 2018.05.01
AlertDialog (알림 대화상자)  (0) 2018.04.28

+ Recent posts