[Do it! 안드로이드 앱 프로그래밍 #7] 레이아웃 인플레이션 이해하기
Android

[Do it! 안드로이드 앱 프로그래밍 #7] 레이아웃 인플레이션 이해하기

07 레이아웃 인플레이션 이해하기

안드로이드 앱은 화면 배치를 알려주는 XML 레이아웃 파일과 화면의 기능을 담당하는 소스 코드 파일로 분리하여 개발해야 한다. 이렇게 하면 관리가 수월해지기 때문이다. 그리고 두 파일은 setContentView 메서드가 연결해 준다는 것을 예전에 배웠다.

 

앱이 실행될 때 XML 레이아웃의 내용이 메모리에 객체화되고 객체화된 XML 레이아웃을 소스 파일에서 사용한다. XML 레이아웃의 내용이 메모리에 객체화되는 과정을 인플레이션(Inflation)이라고 한다.

 

XML 레이아웃은 앱이 실행되는 시점에 메모리에 객체화되기 때문에 setContentView 메서드가 호출되기 전에 XML 레이아웃에 정의된 버튼을 참조하지 못한다. 그래서 이 setContentView 메서드가 매우 중요한데, 이 메서드는 두 가지 역할을 수행한다.

 

setContentView 메서드의 역할
① 화면에 나타낼 뷰를 지정한다.
② 레이아웃 내용을 메모리에 객체화한다.

 

하지만 setContentView 메서드는 액티비티의 화면 전체(메인 레이아웃)를 설정하는 역할만 수행하기 때문에 부분 화면(부분 레이아웃)을 메모리에 객체화할 수는 없다. 이때 사용하는 것이 인플레이터이다.

 

메인 레이아웃과 부분 레이아웃
메인 레이아웃과 부분 레이아웃

메인 레이아웃과 부분 레이아웃의 XML 파일을 생성한다. 메인 레이아웃의 container에 부분 레이아웃을 띄울 것이다.

 

▼ 메인 레이아웃에 부분 레이아웃 추가하기

public class MenuActivity extends AppCompatActivity {
    LinearLayout container;

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

        container = findViewById(R.id.container);

        Button button = findViewById(R.id.button2);
        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("로딩되었어요.");
            }
        });

    }
}

부분 레이아웃을 메모리에 객체화하려면 인플레이터를 사용해야 하는데 안드로이드는 이를 위해 시스템 서비스로 LayoutInflater라는 클래스를 제공한다. LayoutInflater 클래스는 시스템 서비스로 제공하는 클래스이기 때문에 getSystemService 메서드를 이용해야 한다. 시스템 서비스는 나중에 자세히 살펴본다고 한다.

 

inflate 메서드의 파라미터로는 (설정할 내용, 설정할 곳, 설정하느냐 마느냐)를 전달한다. 이 과정을 통해 부분 레이아웃에 정의된 뷰들이 메모리에 로딩되며 객체화 과정을 거치게 된다.

 

부분 레이아웃 파일이 객체화되었으므로 안에 들어있던 텍스트뷰와 체크박스를 findViewById 메서드로 참조할 수 있게 된다.

 

▼ 메인 레이아웃에 부분 레이아웃 추가하기 - 인플레이터 사용법 수정

public class MenuActivity extends AppCompatActivity {
    LinearLayout container;

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

        container = findViewById(R.id.container);

        Button button = findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                LayoutInflater inflater = getLayoutInflater();
                View layout = inflater.inflate(
                        R.layout.sub1,
                        (ViewGroup) findViewById(R.id.sub1_layout_root));
                container.addView(layout);
                
                CheckBox checkBox = container.findViewById(R.id.checkBox);
                checkBox.setText("로딩되었어요.");
            }
        });

    }
}

 

바로 저번 글에서 토스트의 모양과 위치를 바꾸기 위해 인플레이터를 사용했었는데, 그 방법으로 소스 코드를 수정해 보았더니 역시 정상적으로 실행이 된다. 인플레이터를 쓰는 방법이 여러 개인가 보다.

 

메인 레이아웃에 부분 레이아웃 추가하기
메인 레이아웃에 부분 레이아웃 추가하기