상세 컨텐츠

본문 제목

(안드로이드) 레이아웃 인플레이션 및 인플레이터 (layout Inflation & inflator)

Android

by choiDev 2019. 1. 28. 15:33

본문

레이아웃 인플레이션(Layout Inflation)

이 게시물은 LayoutInflator 객체를 사용해 View를 추가하는 예제가 포함되있습니다


레이아웃 인플레이션(Layout Inflation) 개념

  - 부분적인 레이아웃을 객체화 하여 실행중인 레이아웃에 추가할 수 있게 도와주는 클래스이다.

 

레이아웃.xml 정의 -> 실행 -> 메모리로 xml을 로딩 -> 화면에 표현 


인플레이션 과정을 이해하는 것은 실제 앱을 만드는 과정에서 매우 중요합니다. 

왜냐하면 XML 레이아웃 파일은 앱이 실행되는 시점에 로드되어 메모리에 객체화 되기 때문입니다.

만약 setContentView() 메소드가 호출되기 전에 XML 레이아웃에 정의된 버튼을 찾아 참조한 뒤 앱을 실행하면

바로 앱은 실행이 정지 됩니다.


setContentView() 메소드의 역할은 크게 두 가지로 나뉘게 됩니다.

  1. 화면에 나타날 뷰를 지정하는 역할

  2. xml 레이아웃의 내용을 메모리에 객체화 하는 역할


그럼 setContentView() 메소드 호출 이후에는 뷰를 새롭게 추가 할 수 없는 걸까요?

그런 상황을 대비해 LayoutInflater클래스가 있습니다.


LatyoutInflater 객체를 사용해 앱 실행 도중에 뷰를 추가하는 예제를 같이 살펴보시겠습니다.



LayoutInflater 예제

  [activity_main.xml] 작성 코드

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="8"
android:background="@drawable/border"
android:ems="9"
android:gravity="top"
android:hint="에딧텍스트 임다"
android:inputType="textPersonName"
android:padding="8dp" />

<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>

<Button
android:id="@+id/button"
android:layout_width="100dp"
android:layout_height="20dp"
android:layout_gravity="right"
android:layout_weight="1"
android:text="추가 버튼" />
</LinearLayout>

  [activity_sub.xml] 작성 코드

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/border"
android:orientation="horizontal">


<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/note"
android:layout_gravity="center"
android:gravity="center"/>

</LinearLayout>

  

  [MainActivity.java] 작성 코드


public class MainActivity extends AppCompatActivity {
Button button;
LinearLayout container;

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

/**
* View들의 findViewById
* */
container = (LinearLayout) findViewById(R.id.container);
button= (Button) findViewById(R.id.button);

/**
* button 클릭 리스너
* */

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,container,true);
}
});

}
}


이번 글은 여기 까지 입니다.

항상 글이 길어 지지 않도록 노력하고 있습니다.


무슨 주제에 따라 하나를 설명하려면

전 개인적으로 구구절절 엄청 길어지는 글들은 읽기가 불편하고 가독성이 떨어져서

진짜로 필요한 예제만 남길려고 합니다.


실제로 클래스들이 반환하는 타입, 클래스의 구조 같은 것들은 API사이트에서도 볼 수 있으니깐요~!


다들 오늘도 좋은 하루 되시고 항상 건강챙기시는 개발자가 되세요~!!!

관련글 더보기