Android - 레이아웃 인플레이션

유의선·2023년 4월 18일
0

안드로이드 앱은 화면 배치를 알려주는 XML 파일기능을 담당하는 소스 코드 파일로 분리되어 개발된다.
그렇기에 소스 코드 파일과 XML 레이아웃 파일을 연결해 줄 필요가 있다.

소스 코드 파일을 만들면 자동으로 만들어지는 MainActivity 클래스는 AppCompatActivity를 상속하고, AppCompatActivity의 기능 중 하나인 setContentView()를 통해서 레이아웃과 소스 코드 파일을 연결해준다.

public class MainActivity extends AppCompatActivity {

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

이를 통해 앱이 실행될 때 XML 레이아웃의 내용이 메모리에 객체화되고, 객체화 된 XML 레이아웃을 소스 코드 파일에서 사용한다.

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

setContentView()는 화면에 나타낼 뷰를 지정하는 역할과, 레이아웃 내용을 메모리에 객체화하는 두 가지 역할을 수행한다. 이를 통해 XML 레이아웃에 들어 있는 뷰들이 메모리에 객체화 할 수 있도록 해준다.


하지만 setContentView() 메소드는 화면 전체를 설정하는 역할만을 한다. 부분 화면을 메모리에 객체화하려면 인플레이터를 사용해야 한다.

안드로이드는 이를 위해 시스템 서비스로 LayoutInflater라는 클래스를 제공한다.

아래는 버튼을 누르면 activity_main.xml 안에 있는 container 레이아웃에 sub1.xml이라는 레이아웃을 띄워주는 코드이다.

public class MainActivity extends AppCompatActivity {
    LinearLayout container;

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

        container = findViewById(R.id.container);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                inflater.inflate(R.layout.sub1, container, true);
                CheckBox checkBox = container.findViewById(R.id.checkBox);
                checkBox.setText("로딩되었어요.");
            }
        });
    }
}

먼저 getSystemService 메소드로 LayoutInflater 객체를 참조한다.
그리고 LayoutInflater의 inflate 메소드의 파라메터로 R.layout.sub1.xml, container 객체를 전달한다. 이를 통해 sub1.xml에 정의된 뷰들이 메모리에 객체화된다.

inflate 메소드는 첫 번재 파라메터로 XML 레이아웃 리소스를, 두 번째 파라메터로 부모 컨테이너를 지정한다.

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

inflater.inflate(R.layout.sub1, container, true);

이제 sub1.xml 안에 있는 뷰들을 참조해 사용할 수 있게 되었다.

CheckBox checkBox = container.findViewById(R.id.checkBox);
checkBox.setText("로딩되었어요.");


0개의 댓글