안녕하세요 골드입니다.
오늘은 Android에서 코드로 Fragment를 동적으로 생성, 제거, 교체하는 방법에 대해서 글을 쓰도록 하겠습니다.
Fragment는 Activity가 존재해야 존재할 수 있습니다.
Activity에 추가된 Fragment를 생성하거나 제거, 교체하기 위해서 사용되는 메서드들은 Fragment Manager에서 제공합니다. Fragment Manager를 먼저 선언하고 Fragment Transaction를 사용하여 Fragment를 생성하거나 할 수 있습니다.
Fragment Manager는 Activity가 Fragment를 관리하기 위해서 선언하게 됩니다.
Fragment Manager의 참조는 getSupportFragmentManager 메서드를 사용합니다.
1. activity_main.xml
먼저 activity_main.xml에 동적으로 생성할 Fragment를 담을 ViewGroup을 하나 생성합니다.
버튼을 하나 생성하고 Fragment를 담기 위한 FrameLayout을 생성했습니다.
FrameLayout은 기본적인 layout입니다. 하나의 화면을 나타냅니다.
2. MainActivity에서 Fragment Manager 사용
Fragment같은 경우 findFragmentByTag 메서드를 호출하여 Fragment를 찾는데 사용할 수 있습니다.
현재 Activity에서 Fragment를 관리하기 위한 FragmentManager를 생성합니다.
생성은 new가 아닌 getSupportFragmentManager()로 가져올 수 있습니다.
그 다음
Fragment를 동적으로 생성, 제거, 교체하기 위해서 필요한
FragmentTransaction을 생성합니다.
새로운 Fragment Transaction을 생성하기 위해 beginTransaction 메서드를 사용합니다.
다음에 add, remove, replace 메서드를 사용해서 Fragment를 생성하거나 할 수 있습니다.
커스텀 fragment를 참조합니다.
(커스텀 fragment는 임의로 만든 파일입니다.)
(Fragment를 생성하기 위해서 .java(.kotlin)파일을 만들고 Fragment를 상속받은 것입니다.)
먼저 뷰그룹에 fragment 존재 여부를 판단합니다.
해당 fragment가 있는지 확인 후
앞서 말한 FragmentTransaction을 사용해서 동적으로 생성한다고
manager에게 알려줍니다.
add메서드를 사용합니다. fragment는 부모 뷰그룹이 필요하기 때문에
앞서 xml에서 정의한 framelayout id값을 참조합니다.
마지막에 commitNow을 호출해서 transaction이 완료될 때까지 방해받지 않게 합니다.
commit과 commitNow가 있습니다.
commit은 transaction이 비동기적으로 실행되도록 합니다.
commitNow는 현재 transaction이 백 스택에 추가되어 있지 않을 때만 사용할 수 있습니다.
여기까지 작성하고 플레이하면 fragment가 activity에 동적으로 추가됩니다.
-----------------------------------------------------------------------------------------------------
다음은 버튼을 눌렀을 때 기존 fragment를 제거하고
새로운 fragment를 생성하겠습니다.
적절한 코드는 아니지만 버튼을 사용하겠습니다.
뷰그룹에 fragment의 존재여부를 판단합니다.
사실 있어도 없어도 remove를 선언했기 때문에 기존 fragment가 존재했다면 지워집니다.
중간에 setTransition을 추가해서 어색하지 않게 만들어줍니다.
setTransition으로 fragment에 애니메이션을 추가해줄 수 있습니다.
custom animation을 적용하려면 setCustomAnimations를 사용하면 됩니다.
fragmentTransaction.setCustomAnimations()
추가로 백 스택에 추가하기 위해 호출한 addToBackStack 메서드는 commit 전에 호출되어야 합니다.
플레이 해보겠습니다.
버튼을 누르면
새로운 fragment가 view에 할당됩니다.
여기까지 골드였습니다.
감사합니다.
참고자료 : Professional Android
'Mobile > Android(Java)' 카테고리의 다른 글
[Android/java] Preference UI 빌드, 어플리케이션 설정 구현 (0) | 2020.04.15 |
---|---|
[Android/java] SwipeRefreshLayout을 이용하여 당겨서 리스트 새로고침구현하기 (0) | 2020.04.12 |
[Android/java] Camera 사용하기 (동적으로 ImageView 만들어서 Layout에 삽입하기) (0) | 2020.03.23 |
[Android/java] AlertDialog.Builder를 통한 Custom Dialog 만들기 (0) | 2020.03.14 |
[Android/java] RecyclerView를 활용하여 ListView 만들기 (0) | 2020.03.06 |