인플레이션 이해하기

OneTwoThree·2022년 8월 9일

부스트코스 인플레이션 이해하기

액티비티

안드로이드의 화면은 액티비티라고 한다.
사용자의 눈에 보이는 부분 말고 동작하는 부분은 java 소스코드로 만들게 된다.
그래서 하나의 화면은 사용자의 눈에 보이는 부분인 xml 파일과 동작하는 부분인 java 소스코드로 구성된다.

자바 파일의 setContentView 메소드에 인자로 R.layout.activity_main을 전달하면
이 메소드가 xml 파일과 java 파일을 연결해서 하나의 파일을 구성한다.

인플레이션

xml 파일을 보면 Button 태그가 있는다.
실제 버튼은 버튼 객체가 생겨서 작동하는건데 xml 파일에 Button을 넣을 때는 그런 과정이 없다.

따라서 이렇게 버튼 객체를 만드는 과정을 안드로이드 스튜디오가 해주는 것이다.
이것을 인플레이션 이라고 한다.

setContetnView가 내부적으로 인플레이션을 해준다. 즉 Button 태그 이런 것들을 객체화 시켜준다. 화면에 나타낼 뷰를 지정하고 XML 레이아웃의 내용을 메모리 상에 객체화한다.
따라서 setContentView 메소드 호출 이전에 버튼 대상으로 메소드를 호출하면 에러가 발생한다.
아직 버튼 객체가 만들어지지 않았기 때문이다.

일부 화면 인플레이션

전체 화면은 setContentView로 인플레이션 하지만 부분 화면을 인플레이션 할 때는 setContentView를 사용할 수 없다.
이때는 LayoutInflater 클래스를 이용해서 직접 인플레이션 해줘야 한다.

부분 화면은 레이아웃 안에 화면을 다시 구성할 수 있다. 이것을 부분화면이라고 한다.

부분화면도 xml파일 하나랑 java 파일 하나로 구성될 수 있다.

시스템 서비스

안드로이드 단말기가 실행 됐을때 뒷단에서 미리 실행된 것이다.
(시스템이 미리 실행시켜놓은 화면 없는 프로세스)
LayoutInflater 서비스를 이용해서 직접 부분화면을 인플레이션 한다.

부분화면을 만들기 위해 제약 레이아웃 안에 프레임레이아웃을 하나 넣는다
그리고 프레임레이아웃의 id를 container로 바꿔줬다.
그리고 res>layout 밑에 sub1.xml을 만든다.

sub1.xml은 LinearLayout으로 다음과 같이 구성했다.

부분화면을 위해 java 소스파일도 만들어야 한다.
지금 만든 xml 파일을 이용해서 새로운 뷰를 만들수도 있고
객체화(인플레이션)해서 원래 화면에 가져갈 수도 있다.

package com.example.mylayoutinflater;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    FrameLayout container;

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

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

        Button b = (Button)findViewById(R.id.button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

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

            }
        });

    }
}

activity_main.xml에 버튼 객체 가져오고 버튼 리스너 등록해준다.
위를 보면 프레임레이아웃을 미리 변수선언 해놓고 아이디를 이용해서 객체를 가져왔다.
그리고 sub1.xml 파일에 레이아웃을 구성해놓았는데, 그걸 객체화 해서 프레임레이아웃에 넣어야 한다.

먼저 LayoutInflater 객체를 만들어서 inflater 변수에 저장한다
inflater의 inflate 함수를 호출한다.
첫번째 인자로 sub1 xml 파일을 전달하고 두번째 인자로 어떤 뷰에 붙일지 넣는다.
위에서 container 변수에 프레임레이아웃을 지정해놔서 그걸로 전달한다.
그리고 세번째 인자인 true는 지금 바로 한다는 것이다.

0개의 댓글