RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Android/Android

[Android/Fragment] 1.1 Fragment 추가 예제 코드 까보기

2022. 7. 11. 11:06
728x90
반응형

이전에 Fragment에 대해서 공부할 때 나온 예제 코드가 아래와 같이 있습니다.

class ExampleActivity: AppCompatActivity(R.layout.example_activity) {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        
        if (savedInstanceState == null) {
        	supportFragmentManager.commit {
            	setReorderingAllowed(true)
                add<ExampleFragment>(R.id.fragment_container_view)
            }
        }
    }
}

 

이번에는 위의 코드의 내부가 어떻게! 돌아가는지 한번 까보겠습니다.🛠🛠

 

1. supportFragmentManager.commit()

public inline fun FragmentManager.commit(
    allowStateLoss: Boolean = false,
    body: FragmentTransaction.() -> Unit
) {
    val transaction = beginTransaction()
    transaction.body()
    if (allowStateLoss) {
        transaction.commitAllowingStateLoss()
    } else {
        transaction.commit()
    }
}

commit 코드는 간단하네요. FragmentManager의 확장함수이므로 commit 메서드 내의 this는 FragmentManager 입니다.

 

그럼 순서대로 하나씩 알아보도록 하겠습니다.

(1) beginTransaction()

위에서 말씀드린대로 현재 this는 FragmentManager이므로 FragmentManager.beginTransaction()과 동일합니다.

이름 그대로 transaction을 생성하는 함수입니다.🤗

 

👇🏻내부를 보면 아래와 같은 것을 알 수 있습니다.

@NonNull
public FragmentTransaction beginTransaction() {
    return new BackStackRecord(this); // this = manager
}

 

 

(2) transaction.body()

이 body 메서드는 매개변수로 전달된 body입니다!

body가 FragmentTransaction의 수신 객체 지정 메서드이기 때문입니다.👍🏻

 

그럼 저희가 전달한 body 메서드를 봐볼까요.

setReorderingAllowed(true)
add<ExampleFragment>(R.id.fragment_container_view)

수신객체가 FragmentTransaction이기 때문에 모든 메서드들은 FragmentTransaction의 멤버 함수입니다.

 

📌 2.1 setReorderingAllowed(Boolean)

트랜잭션 내 작업을 최적화할지 허용할지 여부를 설정하는 메서드입니다.

두 Transaction이 함께 실행되어, Fragment A가 추가하고나서 Fragment B로 교체되었을 때는 어떻게 동작하게 될까요?

만약 최적화를 허용하지 않는다면 앞에서 말한 순서대로 Transaction이 순서대로 실행될 것입니다.

 

하지만 최적화를 허용했다면 Fragment A는 create/destroy 라이프사이클을 거치지 않고 그대로 작업이 취소되며

Fragment B 작업을 바로 수행하게 됩니다.

🌹 하지만 만약 각 transaction이 순차적으로 실행되는 것을 보장하길 원한다면, setReorderingAllowed(false)로 지정해야 합니다.

 

📌 2.2 add

이름 그대로 Fragment back stack에 새로운 Fragment를 추가하는 명령어입니다.🤗

 

(3) commit

이제 원하는 작업을 완료하였다면, 해당 작업을 실제로 반영(commit)해줄 필요가 있습니다.

 

이때, 코드를 보면 allowStateLoss 값에 따라 commit()과 commitAllowingStateLoss()를 실행하는 것을 볼 수 있습니다.

이 둘의 차이점은 무엇일까요?🧐🧐

 

위의 그림처럼 Activity가 어떤 이유에 의해 종료가 되고 이 때문에 onSaveInstanceState()가 호출되어

상태 값들을 저장하는 과정을 거치게 됩니다.

🌹 그리고 Fragment는 Host Activity의 상태가 저장된 이후에는 commit 명령어를 수행할 수 없습니다.

이 때문에 commit()을 이용하는 시점에 이밈 상태값들이 저장된 이후라면 IllegalStateExcepion 예외가 발생하게 됩니다.

 

그렇다면 commitAllowingStateLoss()는 무엇이 다를까요?

onSavedInstanceState() 이후에 호출된 Transaction 상태들은 commit이 되지 않습니다.

그러므로 이러한 변경된 상태들이 손실되는 것을 허용한다는 점이 다릅니다.(Commit potentially lost)

 


Fragment를 추가하는 방법과 관련된 코드에 대해서 좀 더 알아보았습니다.🤗

오랜만에 코드를 까보니 새로운 점에 대해 알게 되어 재미있는 시간이었습니다.ㅎㅎ

 

다음은 무엇을 해볼까요!

반응형

'Android > Android' 카테고리의 다른 글

[Android:Codelab] Testing Basic-2  (0) 2023.01.20
[Android:Codelab] Testing Basic-1  (0) 2023.01.20
[Android/Fragments] 1. Fragment Manager  (0) 2022.07.11
[Android/Fragments] 1. Fragments란?  (0) 2022.07.10
[Jetpack Compose Codelab-1] Jetpack Compose 기본  (0) 2022.06.01
    'Android/Android' 카테고리의 다른 글
    • [Android:Codelab] Testing Basic-2
    • [Android:Codelab] Testing Basic-1
    • [Android/Fragments] 1. Fragment Manager
    • [Android/Fragments] 1. Fragments란?
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바