본문 바로가기
Android/Concepts

Inflation과 Layout Inflater

by JuHy_ 2019. 8. 9.

Inflation이란?

안드로이드의 Activity는 보여지는 화면을 구성하는 xml과 내부적으로 동작하는 java 코드로 구성되어 있다.

 

우리가 view를 하나 만들기 위해서는 먼저 xml 파일에 원하는 view 태그를 만들게 된다.

하지만 xml 파일에서 버튼을 만들었다고 실제로 버튼이 만들어진 것은 아니다.

실제로 버튼이 만들어지기 위해서는 버튼을 메모리에 올려놓아야 한다.

이렇게 view를 메모리에 올려 객체화하는 것을 inflation이라고 한다.

 

Layout Inflater란?

view를 inflate하기 위해서는 new View()와 같이 메모리를 할당하는 코드가 필요하다.

그러나 우리는 이 코드를 직접 만들지 않아도 xml 파일에만 만들면 view를 볼 수 있다.

이는 메모리에 할당되지 않은 것이 아니라 Layout Inflater가 알아서 inflation을 수행했기 때문이다.

 

처음 앱을 만들면 setContentView(R.layout.activity_main); 함수가 실행되도록 되어있는데

이 함수의 내부에서 layout inflater가 실행되어 view들을 객체화하는 것이다.

 

//실행되지 않는 코드
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    Button button1 = findViewById(R.id.button1);

    setContentView(R.layout.activity_main);
}

따라서 위와 같이 setContentView()를 실행하기 전에는 해당 레이아웃의 view를 불러오지 못한다.

 

LayoutInflater 직접 사용하기

그렇다면 setContentView()를 통해 inflater를 실행시키지 말고 직접 실행시켜야 할 때는 어떻게 해야 할까.

예를 들어 activity_main.xml 안에 sub1.xml이라는 다른 layout 파일을 불러오는 코드를 만들어보자.

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="300dp"
        android:layout_height="300dp">

    </FrameLayout>

</LinearLayout>

▲ activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/design_default_color_primary">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textColor="#FFFFFF"
        android:textSize="40sp" />

</LinearLayout>

▲ sub1.xml

먼저 activity의 layout 파일과 안에 들어갈 layout 파일을 만들어주자.

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        FrameLayout container = findViewById(R.id.container);

        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.sub1, container, true);

        TextView textView = container.findViewById(R.id.textView);
        textView.setText("부분 화면");

    }

}

이제 안에 들어갈 레이아웃을 inflate해서 activity_main.xml의 FrameLayout에 넣어주려 한다.

이 때에는 getSystemService(Context.LAYOUT_INFLATER_SERVICE) 함수를 통해 직접 layout inflater를 실행해야 한다.

 

먼저 layout을 담을 FrameLayout과 LayoutInflater를 불러온다.

그 다음 inflater의 inflate 함수에 불러올 layout 파일과, 담을 layout, 그리고 담을 layout을 자식으로 할 지를 정해준다.

이렇게 inflate 함수를 실행하면 sub1.xml이 container라는 FrameLayout의 자식으로 inflate되게 된다.

 

이제부터 container.findViewByID()를 통해 sub1.xml의 view들에 접근할 수 있다.

 

layout 파일이 잘 불러와졌고, text 또한 정상적으로 변경된 것을 볼 수 있다.

 

 

Reference

[부스트코스]안드로이드 프로그래밍

https://www.edwith.org/boostcourse-android

'Android > Concepts' 카테고리의 다른 글

Spinner 사용법  (0) 2020.03.24
ListView 사용법  (0) 2019.08.21
Button을 상속받아 커스텀 Button 만들어보기  (0) 2019.08.08
나인패치(Nine Patch) 이미지란?  (0) 2019.08.08
Dialog 사용법 - AlertDialog  (0) 2019.08.02