[Android] Activity, Fragment, Inflater

반응형
반응형

 

개인적인 학습 용도로 정리한 글이기에 잘못된 내용을 포함하고 있을 수 있습니다.


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); // 다이얼로그를 호춯한다.
반응형

댓글

Designed by JB FACTORY