
개인적인 학습 용도로 정리한 글이기에 잘못된 내용을 포함하고 있을 수 있습니다.
Inflater란?
xml로 정의한 레이아웃을 메모리에 올리고 객체화시키는 함수
모든 xml 레이아웃은 Inflater를 통해 객체화된다.
Activity With Inflater
Activity로 화면을 생성할 경우 Java/Kotlin 소스코드와 xml 레이아웃 파일 2개가 생성된다.
나는 Activity로 화면을 생성했을 때 Inflater를 호출한 적이 없는데?라고 생각할 수 있으나
Activity에서 onCreate() 메서드 내부의 setContentView() 메서드가 내부 생명주기에서 자동으로 Inflater를 호출해 주기에 inflater를 사용하지 않는 것처럼 보이는 것이다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main); // inflate
}
}
Fragment With Inflater
Fragment 방식으로 화면을 생성하는 경우도 마찬가지다.
onCreateView 함수 내부에서 inflater.inflate를 호출해 xml 레이아웃을 메모리에 로딩한다.
public class WordListFragment extends Fragment {
...
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// fragment_word_list.xml 레이아웃을 View 객체로 변환해서 반환
return inflater.inflate(R.layout.fragment_word_list, container, false);
}
즉, 어떤 방식으로 xml 화면을 구성하던지 반드시 Inflate로 xml 레이아웃을 메모리에 로딩해야 화면을 띄울 수 있다는 것이다.
Dynamic Inflater
Inflate 메서드를 사용하면 동적으로 xml을 원하는 시점에 출력할 수 있다.
inflate(레이아웃 파일 id, 생성될 뷰의 parent, 생성되는 View를 자동으로 자식에 추가할지 여부 [true/false])
만약 Activity에 딸린 Fragment 내부에서 xml을 inflate로 동적으로 호출하고 싶다면 아래와 같이 Fragment의 부모 Acitvity 정보를 getContenxt()로 가져와야 한다.
다음은 프래그먼트 내부에서 inflate를 사용해 Dialog를 호출하는 예제이다.
// dialogVIew는 dialog_create_word_list.xml 파일을 인플레이트하여 생성
// inflate : XML Layout을 실제 View 객체로 변환하는 메서드
LayoutInflater inflater = LayoutInflater.from(requireContext()); // 현재 프래그먼트가 붙어있는 액티비티의 인플레이터를 받아온다.
View dialogView = inflater.inflate(R.layout.dialog_create_word_list, null, false); // 다이얼로그를 호춯한다.